21

次の状況を考慮してください。

using namespace std;
unordered_map<int, vector<A>> elements;

今、私はこの順序付けられていないマップを繰り返し処理しています:

for (auto it = elements.begin(); it != elements.end(); ++it)

ループ内で、elements(現在の要素をit指している要素とそれ以上の要素であり、必ずしも次の要素であるとは限りません!) のいくつかの要素からクラスターを形成しています。各要素は 1 つのクラスターの一部にすぎないため、それらをマップから削除してから、次の要素 (つまり、次のクラスターの構築) に進みたいと思います。

どうすればこれを行うことができ、正しい位置で反復を続行できますか?

4

3 に答える 3

38
for (auto it = elements.begin(); it != elements.end();) {
   if(you have to rease) {
      it = elements.erase(it);
   }
   else
      it++;
}

このようにして、消去後にインクリメントしないようにし、また end() をインクリメントしないようにします。

何もインクリメントしない for ループを使用する正当な理由はないという提案の後、代わりに while ループを使用することをお勧めします。主に読みやすさのため。

于 2013-03-27T15:21:04.477 に答える
18

unordered_map::erase削除された要素を過ぎたイテレータを返します。

次のようなコードが必要です。

it = myMap.erase( it );

重要な注意:ループ内でこれを実行している場合、これが実行された場合、ループの最後での通常のインクリメントを回避する必要があります。it

于 2013-03-27T15:18:24.630 に答える
6

このerase関数は、削除された要素の後に反復子を返します (すべてのコレクションerase関数がそうします)。それを使用して続行できます。

要素を消去する場合、または 1 つの要素をまたがる場合は、反復子を増やさないことを忘れないでください。

于 2013-03-27T15:18:05.373 に答える