ループ内のベクトルから要素を削除する
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 & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
このコードでは、 std::remove_if() アルゴリズムを使用して、資金がマイナスまたはゼロのプレイヤーを除外し、 Erase() を使用してベクターから削除します。
以上がC で反復中にベクトルから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。