ホームページ > バックエンド開発 > C++ > C 11 で反復中にベクトルから要素を安全に削除するにはどうすればよいですか?

C 11 で反復中にベクトルから要素を安全に削除するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-28 20:56:11
オリジナル
380 人が閲覧しました

How to Safely Remove Elements from a Vector While Iterating in C  11?

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 つの問題が発生します:

  1. 要素を削除できません: 範囲ベースの for ループでは、ベクトルを反復処理するときにベクトルを変更する方法が提供されません。
  2. ループの有効性: ベクターから要素を削除すると、潜在的にloop.

ソリューション

範囲ベースの 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート