C++ C++;向量迭代器:比较和删除两个元素

C++ C++;向量迭代器:比较和删除两个元素,c++,vector,iterator,erase,C++,Vector,Iterator,Erase,我有一个名为scene的std::vector,它存储指向形状的指针。我需要能够遍历向量,将迭代器指向的形状与迭代器中的下一个形状进行比较。如果s1->intersects(*s2)的返回为真,我需要从向量中删除s1和s2。下面的代码不正确,我得到一个异常向量interator不可递增 我怎样才能解决这个问题 while (scene.size() > 1) { for (std::vector<Shape*>::iterator it = scene.begin();

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

我怎样才能解决这个问题

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);
        }
    }
}
while(scene.size()>1)
{
对于(std::vector::iterator it=scene.begin();it!=scene.end()-1;it++)
{
形状*s1=(*it);
形状*s2=(*(it+1));
如果(s1->相交(*s2))
{
删除s1;
删除s2;
//从向量中删除指向s1和s2的指针。
它=场景。擦除(它);
它=场景。擦除(它);
}
}
}

向量迭代器在被擦除时无效。
您应该使用vector::erase(迭代器优先,迭代器最后);同时删除向量中的多个对象。

鉴于您的代码已经假定向量中没有空指针,您可以使用空指针作为删除标记,通过将标记与删除分离,大大简化了逻辑

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());
for(std::vector::iterator it=scene.begin();it相交(*s2))
{
删除s1;
删除s2;
s1=空;
s2=零;
++它;
}
}
scene.erase(std::remove(scene.begin(),scene.end(),NULL),scene.end());

另外,您的原始代码可能已经通过更改
it!=scene.end()-1
。因为如果最后删除最后两个元素,则会有一个迭代器,它等于
scene.end()
,满足条件
it!=scene.end()-1
,循环将尝试增加它。

这几乎是正确的(很好!),但是当交叉点案例将
s2
设置为
NULL
然后将
it
仅增加一个位置时,
s1->
将是下一个循环上的
NULL
指针解引用。看起来不错,+1和窗帘作为我的答案-这有较少的元素复制。