3

イテレータによって要素、ポインタを消去すると、イテレータが無効になることは(すべて)わかっています。次に例を示します。

std::map< .. > map_;
std::map< .. >::iterator iter;
// ..
map_.erase( iter ); // this will invalidate `iter`.

しかし、どうですか:

map_.erase( map_.begin() );

これは安全ですか?map_.begin()マップの (新しい) 最初の要素を指す有効な反復子になりますか?

「テストする」は解決策ではありません。

4

4 に答える 4

4

begin()イテレータではありませんが、イテレータを返します。最初の要素を消去した後、begin()別の (有効な) イテレータを返します。

 std::map<int, int> m;
 m[1] = 2;
 m[2] = 3;
 m.erase(m.begin()); // <- begin() points to 1:2
 std::cout << m.begin()->second; // <- begin() points to 2:3 now
于 2013-05-22T07:18:09.307 に答える
3

cppreferenceでは、次のように表示されます。

すべてのイテレータ (pos、first、last) は有効で逆参照可能でなければなりません。つまり、end() イテレータ (有効ですが、逆参照可能ではありません) は使用できません。

それはあなたの質問にほとんど答えます。によって返される反復子begin()が有効であり、参照解除可能である限り、 で使用しても問題ありませんstd::map::erase()begin()が で使用できるかどうかを確認する良い方法は、std::map::eraseと等しくないかどうかを確認することですend()

if(map.begin() != map.end()) {
   map.erase(map.begin());
}

または、マップが空かどうかを確認し、std::map::eraseそうでない場合は使用することもできます

if(!map.empty()) {
   map.erase(map.begin());
}
于 2013-05-22T07:33:56.823 に答える
2

もちろん。

map::begin は、マップ コンテナの最初の要素を参照 する有効な反復子を返します。http://www.cplusplus.com/reference/map/map/begin/

空のマップに注意してください。

于 2013-05-22T07:20:39.840 に答える