std::list を反復処理しながら要素を削除できますか? 質問する

std::list を反復処理しながら要素を削除できますか? 質問する

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

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++「リスト反復子が増分できません」というエラーが発生します。for ステートメントで増分しないいくつかの代替案を試しましたが、何も機能しませんでした。

std::list を調べているときにアイテムを削除する最適な方法は何ですか?

ベストアンサー1

まずイテレータをインクリメントし (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;
    }
}

おすすめ記事