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

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

Barbara Streisand
リリース: 2024-12-06 14:45:13
オリジナル
934 人が閲覧しました

How to Safely Remove Elements from a Vector During Loop Iteration in C  ?

ループ内のベクトルからの要素の削除

ループの反復中にベクトルから要素を効果的に削除する方法を知ることが重要です。次のコードを使用してこれを実行しようとすると、エラーが発生する可能性があります:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
{
    if(it->getpMoney() <= 0)
        it = allPlayers.erase(it);
    else
        ++it;
}
ログイン後にコピー

エラー メッセージ「operator '=' function is unavailable in 'Player'」は、ベクター内のオブジェクトを使用できないことを示しています。直接再割り当てされます。これを解決するには、Player クラスは代入演算子 (=) を実装する必要があります。

さらに、これはすでに内部で処理されているため、反復子の明示的なインクリメントを避けるために for ループを変更する必要があります。

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); )
{
    if(it->getpMoney() <= 0)
        it = allPlayers.erase(it);
    else
        ++it;
}
ログイン後にコピー

生のループを使用する代わりに、消去-削除イディオムを利用してより効果的な処理を行うことをお勧めします。効率:

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(),
        allPlayers.end(),
        [](Player const &amp; p) { return p.getpMoney() <= 0; }
    ),
    allPlayers.end()
);
ログイン後にコピー

このイディオムは、remove_if アルゴリズムを使用して、指定された条件を満たす要素 (この場合は資金がゼロまたはマイナスのプレイヤー) をフィルターで除外し、その後、erase 関数を使用してそれらをベクトルから削除します。 .

以上がC でループ反復中にベクトルから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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