如果满足某些条件,我目前正在尝试从 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或使用反向迭代器。

09-06 14:52