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

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

Barbara Streisand
リリース: 2024-12-04 04:09:13
オリジナル
182 人が閲覧しました

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

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

ベクトルを反復処理する場合、以下に基づいて要素を削除する必要があるシナリオが存在する場合があります。特定の基準。ただし、反復中にベクトルを変更しようとすると、ランタイム エラーが発生する可能性があります。

次のシナリオを考えてみましょう:

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

このコードは、所持金がゼロまたはマイナスのプレイヤーを削除することを目的としています。ただし、代入演算子に関連するエラーが発生して失敗します。この問題を解決するには、ループ内でイテレータをインクリメントしないようにします。代わりに、erase() 関数によって返されるイテレータを利用します。

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

さらに、erase() 関数によるoperator= の使用には、Player クラスが割り当て可能である必要があります。つまり、Player クラスは実装する必要があります。代入演算子。

ベクトルの消去-削除イディオム操作

ベクトルから要素を削除するタスクを簡略化するには、Erase-Remove イディオムを採用します。

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

このイディオムは、remove_if() アルゴリズムを組み合わせて、削除する要素を識別します。 Erase と Erase() メソッドを使用して、必要な範囲を削除します。

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

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