ホームページ >バックエンド開発 >C++ >C 11 範囲ベースの For ループ内のベクトルから要素を削除できますか?

C 11 範囲ベースの For ループ内のベクトルから要素を削除できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 01:32:09855ブラウズ

Can We Remove Elements from a Vector Inside a C  11 Range-Based For Loop?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。