C 11 範囲ベースのループ中のベクトルからの要素の削除
C 11 の範囲ベースの for ループは、反復処理を行う便利な方法を提供します。コンテナの要素、特に各要素に対してアクションを実行する必要がある場合。ただし、ベクトルを扱う場合、反復処理中にベクトルから要素を削除する必要がある場合があります。
問題
次のコードを考えてみましょう:
std::vector<IInventory*> inv; inv.push_back(new Foo()); inv.push_back(new Bar()); for (IInventory* index : inv) { // Do some stuff // ... }
ループ内で、ベクトル inv から特定の要素を削除する必要があることがわかります。ただし、次の 2 つの問題が発生します:
ソリューション
範囲ベースの for ループは、コンテナーの各要素に 1 回だけアクセスする必要がある状況を対象としています。反復中に要素を変更または削除する必要がある場合は、従来の for ループ、またはその反復子ベースのバリエーションの 1 つを使用する必要があります。
反復子の増分管理を備えた従来の for ループを使用してコードを変更する方法は次のとおりです。
for (auto i = inv.begin(); i != inv.end(); /*++i*/) { // Do stuff if (should_remove) { i = inv.erase(i); } else { ++i; } }
反復子の増分を明示的に管理することで、ループの有効性が維持され、問題が発生することなく要素を削除および変更できるようになります。エラー。
以上がC 11 で反復中にベクトルから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。