次のようなコードがあります:
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;
}
}