アイテムがstd :: multimap<>から削除された後、イテレータを引き続き使用できますか? [複製]
質問
この質問にはすでに回答があります:
multimap :: erase()を呼び出した後でも、マルチマップイテレータを引き続き使用できますか?例:
Blah::iterator iter;
for ( iter = mm.begin();
iter != mm.end();
iter ++ )
{
if ( iter->second == something )
{
mm.erase( iter );
}
}
これは正しく実行されることが期待されますか、それとも消去の呼び出し後にイテレータが無効になりますか? http://www.cplusplus.com/reference/stl/multimapなどの参照サイト/erase.html は、イテレータの寿命に関するこのトピック、またはイテレータに対する建設的/破壊的メソッドの効果について奇妙に静かです。
解決
http://www.sgi.com/tech/stl/Multimap.html
Multimap has the important property that inserting a new element
into a multimap does not invalidate iterators that point to existing
elements. Erasing an element from a multimap also does not invalidate
any iterators, except, of course, for iterators that actually point to
the element that is being erased.
したがって、次のようになります。
Blah::iterator iter;
for ( iter = mm.begin();iter != mm.end();)
{
if ( iter->second == something )
{
mm.erase( iter++ );
// Use post increment. This increments the iterator but
// returns a copy of the original iterator to be used by
// the erase method
}
else
{
++iter; // Use Pre Increment for efficiency.
}
}
また見なさい: 開始から終了までの反復中にマップ要素でerase()を呼び出すとどうなりますか?
and
他のヒント
C ++標準23.1.2.8:
挿入メンバーは、イテレーターとコンテナーへの参照の有効性に影響を与えてはならず、消去メンバーは イテレータと消去された要素への参照のみを無効にします。
これはすべての連想コンテナに共通の要件であり、std :: multimapはその1つです。
所属していません StackOverflow