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

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

Linda Hamilton
リリース: 2024-12-06 07:19:11
オリジナル
315 人が閲覧しました

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

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

for ループを使用してベクトルを反復処理する際の一般的なタスクは、要素を削除することです。特定の基準に基づいて。ただし、ループ自体内の要素を削除しようとすると、エラーが発生する可能性があります。

次のコードを考えてみましょう:

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'

問題

エラーが発生する理由は次のとおりです。 Erase() メソッドは内部で代入演算子 = を利用して、ベクトル内の要素を移動します。 Erase() を使用するには、Player オブジェクトが割り当て可能である必要があり、Player クラスの Operator= の実装が必要です。

解決策

この問題を解決するには、 for ループ内でインクリメントすることは避けてください:

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

Player クラスの Operator= を実装して、オブジェクト内でオブジェクトを割り当てられるようにします。 Vector.

アルゴリズムを使用した代替アプローチ

コードを簡略化するには、消去-削除イディオムの使用を検討してください。

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

このコードでは、 std::remove_if() アルゴリズムを使用して、資金がマイナスまたはゼロのプレイヤーを除外し、 Erase() を使用してベクターから削除します。

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

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