ループ内のベクトルからの要素の削除
ベクトルを扱うときの一般的なタスクの 1 つは、属性に基づいて特定の要素を削除することです。ただし、反復処理中にベクトルを更新すると、予期しないエラーが発生する可能性があります。
次のコード スニペットを考えてみましょう:
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'
エラーの原因:
このエラーは、std::vector::erase が内部で代入演算子 (=) を使用してベクター内の要素を移動するために発生します。 Erase を使用するには、Player クラスで代入演算子を実装する必要があります。
代入演算子を使用しないソリューション:
代入演算子の要件を回避するには、ループ:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); }
it インクリメントを削除することで、各消去後に反復子が自動的に進みます。
Erase-Remove イディオムを使用したリファクタリング:
よりクリーンな解決策は、Erase-Remove イディオムを使用することです。これは、要素を削除するための簡潔で効率的な方法を提供します。ベクトル:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
このアプローチでは、std::remove_if提供されたラムダ式に基づいてベクトルをフィルタリングします。フィルターされた要素は、std::vector::erase.
を使用して削除されます。以上がC ループ内のベクトルから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。