1. ホーム
  2. c++

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

2023-09-03 14:44:43

質問

私はこの質問と同様の質問があることを知っているが、私はそれらの援助によって私のコード上の方法を見つけることができなかった。私は単にループの中でこの要素の属性をチェックすることによって、ベクトルの要素を削除/削除したい。どうすればいいのでしょうか?以下のコードを試してみましたが、曖昧なエラーメッセージが表示されました。

operator =' 関数は 'Player' で使用できません。

 for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
 {
     if(it->getpMoney()<=0) 
         it = allPlayers.erase(it);
     else 
         ++it;
 }

どうすればいいのでしょうか?

更新してください。 という質問はどうでしょうか? vector::erase with pointer メンバ は、同じ問題に関連していますか?私はそれ故に代入演算子が必要なのでしょうか?なぜですか?

どのように解決するには?

をインクリメントしてはいけません。 it の中で for ループの中に

for (vector<Player>::iterator it=allPlayers.begin(); 
                              it!=allPlayers.end(); 
                              /*it++*/) <----------- I commented it.
{

   if(it->getpMoney()<=0) 
      it = allPlayers.erase(it);
  else 
      ++it;
 }

コメントされている部分に注目してください。 it++ は必要ありません。 it は for-body 自体でインクリメントされるからです。

エラーについては、" 'operator =' 関数は 'Player' で使用できません。 というエラーが出ていますが、これは erase() の使用法に起因するもので、内部的には operator= を使ってベクター内の要素を移動しています。を使用するために erase() を使うには、クラスのオブジェクト Player は割り当て可能でなければなりません。 operator= に対して Player クラスで使用されます。

とにかく避けるべきは 生ループ 1 はできるだけ避け、代わりにアルゴリズムを使用することをお勧めします。この場合、人気のある イレーズ・リムーブ・イディオム は、あなたがやっていることを単純化することができます。

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(), 
        allPlayers.end(),
        [](Player const & p) { return p.getpMoney() <= 0; }
    ), 
    allPlayers.end()
); 

1. の一つです。 ショーン・ペアレンツのベストトーク である。