ループ内のベクトルから要素を削除する
ベクトルを反復処理する場合、以下に基づいて要素を削除する必要があるシナリオが存在する場合があります。特定の基準。ただし、反復中にベクトルを変更しようとすると、ランタイム エラーが発生する可能性があります。
次のシナリオを考えてみましょう:
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 & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
このイディオムは、remove_if() アルゴリズムを組み合わせて、削除する要素を識別します。 Erase と Erase() メソッドを使用して、必要な範囲を削除します。
以上がC での反復中にベクトルから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。