C ++ Vector Iterator:比较和擦除两个元素

时间:2013-11-30 15:45:55

标签: c++ vector iterator erase

我有一个名为std::vector<Shape*>的场景,它存储指向Shapes的指针。我需要能够遍历向量,将迭代器指向的形状与迭代器中的下一个形状进行比较。如果s1->intersects(*s2)的返回为真,我需要从向量中删除s1和s2。以下代码不正确,我得到异常vector interator is not incrementable

我该如何解决这个问题?

while (scene.size() > 1)
{
    for (std::vector<Shape*>::iterator it = scene.begin(); it != scene.end() - 1; it++)
    {
        Shape* s1 = (*it);
        Shape* s2 = (*(it + 1));

        if (s1->intersects(*s2))
        {
            delete s1;
            delete s2;

            // Remove the pointers to s1 and s2 from the vector.
            it = scene.erase(it);
            it = scene.erase(it);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

看看你的代码已经假定你的向量中没有空指针,你可以使用空指针作为删除标记,通过将标记与擦除分开来大大简化逻辑。

for (std::vector<Shape*>::iterator it = scene.begin(); it < scene.end() - 1; ++it)
{
    Shape*& s1 = (*it);
    Shape*& s2 = (*(it + 1));
    if (s1->intersects(*s2))
    {
        delete s1;
        delete s2;
        s1 = NULL;
        s2 = NULL;
        ++it;
    }
}

scene.erase(std::remove(scene.begin(), scene.end(), NULL), scene.end());

另外,您可以通过将it != scene.end() - 1更改为it < scene.end() - 1来修复原始代码。因为如果你最终删除最后两个元素,你将有一个等于scene.end()的迭代器,它满足条件it != scene.end() - 1,并且循环将尝试递增它。

答案 1 :(得分:0)

矢量迭代器在擦除时变为无效。 你应该使用vector :: erase(iterator first,iterator last);同时擦除矢量中的多个对象。