質問

たいと思いループを通じて std::map 削除項目に基づく報酬を受け取る場合があります。どういうことすることはできますか。

役に立ちましたか?

解決

またC++11に準拠したコンパイラを参照してください簡単ないということ:

std::map<K, V>::iterator itr = myMap.begin();
while (itr != myMap.end()) {
    if (ShouldDelete(*itr)) {
       itr = myMap.erase(itr);
    } else {
       ++itr;
    }
}

その考え方としては、徒歩反復子からのコンテナは、チェック各ステップかどうか、現在のキーと値のペアは削除することが望ましい。しようとすれば、削除の要素の反復の erase 会員機能し、その反復子を返しま次の要素をまとめたものです。その他の反復子が正常です。

していない場合はC++の11に準拠したコンパイラは、だん古いコードベースも少trickier.前のC++11 erase 会員機能しない反復子を返し、次の要素をまとめたものです。これにより除去するために要素を繰り返し処理のために使ーダンス:

  1. コピーの現在のiterator.
  2. 事前に現在の反復子の次の要素になります。
  3. 電話 erase のコピー、iterator.

これは以下のようになります。

std::map<K, V>::iterator itr = myMap.begin();
while (itr != myMap.end()) {
    if (ShouldDelete(*itr)) {
       std::map<K, V>::iterator toErase = itr;
       ++itr;
       myMap.erase(toErase);
    } else {
       ++itr;
    }
}

このプロセスのために必要だという erase の反復子は、思い invalidate で、企業運営を行うとともに、経営などの増減に繋が定義されます。上記のコードが周辺のこの設定のコピーの反復子の推進 itr その時に、次の要素を消去の一時的なコピーは、iterator.

あなTrickinessでは、この縮小はこのコードの費用を読む以下のパターンは歳以上のC++のコードが必要なC++11:

std::map<K, V>::iterator itr = myMap.begin();
while (itr != myMap.end()) {
    if (ShouldDelete(*itr)) {
       myMap.erase(itr++);  // <--- Note the post-increment!
    } else {
       ++itr;
    }
}

の利用のインクリメントオペレーターがここにある巧みな材料を取り扱っているのコピーを復旧することに注意してください)は、postfix++オペレーターのコピーを返しますのiterator値)を推進、高齢iterator.

他のヒント

for(MyMap::iterator it = mymap.begin(); it!=mymap.end(); ) {
  if(mycondition(it))
    it = mymap.erase(it);
  else
    it++;
}

編集:これが唯一のMSVCで動作しているようです

この EDIT2:C ++ 0xを連想コンテナのこの作品、あまりにも


:これは、1つの簡単な方法です
    int value_to_delete( 2 );
    for( std::map<int, int>::iterator i = mm.begin(); i != mm.end(); ) {
        if( i->second != value_to_delete ) {
            mm.erase( i++ ); // advance before iterator become invalid
        }
        else {
            ++i;
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top