1. ホーム
  2. c++

[解決済み】std::listを繰り返しながら要素を削除することは可能ですか?

2022-04-02 19:08:01

質問

次のようなコードがあります。

for (std::list<item*>::iterator i=items.begin();i!=items.end();i++)
{
    bool isActive = (*i)->update();
    //if (!isActive) 
    //  items.remove(*i); 
    //else
       other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);

更新後すぐに非アクティブなアイテムを削除して、リストを再び歩くのを避けたいのです。 しかし、コメントアウトされた行を追加すると、次の行でエラーになります。 i++ : "List iterator not incrementable"。 for文の中でインクリメントしない代替手段をいくつか試しましたが、うまくいきませんでした。

std::listを歩きながらアイテムを削除する最良の方法は何ですか?

どのように解決するのですか?

まずイテレータを(i++で)インクリメントし、それから前の要素を(i++の戻り値を使うなどして)削除する必要があります。 このように、コードをwhileループに変更することができます。

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}