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 // I need to remove this object from 'inv'... }
範囲ベースのループ内の要素を削除できますか?
いいえ、範囲ベースの for ループ内のベクトルから要素を削除することはできません。これは、ループがベクトル反復子のコピーを作成することによって動作し、要素が削除または追加されると無効になるためです。
したがって、反復中にコンテナーを変更するための代替アプローチを検討することが重要です。
推奨される解決策
推奨されるアプローチは、従来の for ループまたはその変形の 1 つを使用することです。これにより、必要に応じてベクトルを直接操作し、要素を削除できます。例:
auto i = std::begin(inv); while (i != std::end(inv)) { // Do some stuff if (blah) i = inv.erase(i); else ++i; }
以上がC 11 範囲ベースの For ループ内のベクトルから要素を削除できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。