C++ C++;向量迭代器:比较和删除两个元素
我有一个名为scene的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();
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和窗帘作为我的答案-这有较少的元素复制。