を削除したい要素のstd::map反復子?
質問
たいと思いループを通じて 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
会員機能しない反復子を返し、次の要素をまとめたものです。これにより除去するために要素を繰り返し処理のために使ーダンス:
- コピーの現在のiterator.
- 事前に現在の反復子の次の要素になります。
- 電話
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を連想コンテナのこの作品、あまりにも
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;
}
}