アイテムがstd :: multimap<>から削除された後、イテレータを引き続き使用できますか? [複製]

StackOverflow https://stackoverflow.com/questions/446205

  •  22-07-2019
  •  | 
  •  

質問

    

この質問にはすでに回答があります:

         

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つです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top