如果满足某些条件,我目前正在尝试从 vector 中删除2个元素。我可以成功删除单个元素,而不会发生“ vector 迭代器不可引用”错误,我知道问题是由于一次删除两个与迭代器弄乱的元素引起的,但不确定删除多个元素的正确方法元素一次。
vector<SomeObj*> objs;
vector<SomeObj*>::iterator it = objs.begin();
while (it != objs.end())
{
vector<SomeObj*>::iterator it2 = objs.begin();
bool deleted = 0;
while (it2 != objs.end())
{
if ((*it)->somecondition(**it2))
{
delete *it2;
*it2 = NULL;
it = objs.erase(it2);
delete *it;
*it = NULL;
it = objs.erase(it); //Will error here due to invalidating the iterator
deleted = 1;
break;
}
++it2;
}
if (!deleted)
++it;
}
最佳答案
问题在于,第一次调用clear()可能会使另一个迭代器无效。有关在各种容器中无效的内容的简要概述,请参见post。我想说的最简单的解决方案是先遍历容器并标记要擦除的条目,但不要擦除它们,然后在第二次扫描中仅擦除标记的所有内容。出于性能原因,在第二次扫描中,您应该使用std::remove_if或使用反向迭代器。