C++ 使用擦除从向量中擦除元素
所以我想做上面提到的事情。我想出了一个很好的主意,当它涉及到一个通常的迭代,方法的第三部分。但是我不知道当我在一个循环中有一个循环时如何处理这个问题。是的,我知道这是由于擦除时跳过元素造成的C++ 使用擦除从向量中擦除元素,c++,vector,erase,C++,Vector,Erase,所以我想做上面提到的事情。我想出了一个很好的主意,当它涉及到一个通常的迭代,方法的第三部分。但是我不知道当我在一个循环中有一个循环时如何处理这个问题。是的,我知道这是由于擦除时跳过元素造成的 int Collision::missleCollision(vector <Missle*> &missle_vector, vector <Enemy*> &enemy_vector, vector &
int Collision::missleCollision(vector <Missle*> &missle_vector, vector <Enemy*> &enemy_vector,
vector <Obstacle*> &obstacle_vector, bool G)
{
int hit=0;
for (auto it=missle_vector.begin(); it!=missle_vector.end(); ++it)
{
for (auto jt=enemy_vector.begin(); jt!=enemy_vector.end(); ++jt)
{
double x, y;
x=(*jt)->getX()-(*it)->getX();
y=(*jt)->getY()-(*it)->getY();
if (x<64 && x>-151 && y<14 && y>-103)
{
delete *it;
it=missle_vector.erase(it);
delete *jt;
jt=enemy_vector.erase(jt);
hit++;
}
}
}
if(G){
for (auto it = missle_vector.begin(); it!=missle_vector.end(); ++it)
{
for (auto jt = obstacle_vector.begin(); jt!=obstacle_vector.end(); ++jt)
{
double x, y;
x=(*jt)->getX()-(*it)->getX();
y=(*jt)->getY()-(*it)->getY();
if (x<64 && x>-61 && y<14 && y>-61)
{
delete *it;
it = missle_vector.erase(it);
}
}
}
}
for (auto it = missle_vector.begin(); it != missle_vector.end(); )
{
if ((*it)->getX() > 1920)
{
delete *it;
it = missle_vector.erase(it);
}
else
it++;
}
return hit;
}
int冲突::错误集合(向量和错误向量,向量和敌人向量,
向量和障碍物(向量,bool G)
{
int hit=0;
for(auto it=missle_vector.begin();it!=missle_vector.end();+it)
{
对于(自动jt=敌方向量。开始();jt!=敌方向量。结束();++jt)
{
双x,y;
x=(*jt)->getX()-(*it)->getX();
y=(*jt)->getY()-(*it)->getY();
如果(x-151和y-103)
{
删除*它;
它=错误向量。擦除(它);
删除*jt;
jt=敌方向量擦除(jt);
hit++;
}
}
}
如果(G){
for(auto it=missle_vector.begin();it!=missle_vector.end();+it)
{
对于(自动jt=障碍物_向量。开始();jt!=障碍物_向量。结束();++jt)
{
双x,y;
x=(*jt)->getX()-(*it)->getX();
y=(*jt)->getY()-(*it)->getY();
如果(x-61和y-61)
{
删除*它;
它=错误向量。擦除(它);
}
}
}
}
for(auto it=missle_vector.begin();it!=missle_vector.end();)
{
if((*it)->getX()>1920)
{
删除*它;
它=错误向量。擦除(它);
}
其他的
it++;
}
回击;
}
在遍历同一范围时从范围中删除某些内容的一般模式(如果,则不使用诸如std::remove\u之类的高级内容)如下所示:
for (auto it = v.begin(); it != v.end(); )
{
if (pred(it)) { it = v.erase(it); }
else { ++it; }
}
请注意,对于
标题,您不会增加中的迭代器。请参阅。您应该使用算法函数将容器划分为不需要保存的项目。然后从那里开始工作。如果您使用std::vector
…嗯,好的,但是我不能用这个增加两个迭代器,那么代码会短得多。例如:当它是it循环中的JT循环时,当条件不满足时,我会跳到it+1,而不检查第一个JT的其他it。@Volterra:你不能在正确的位置使用break
s来控制哪个循环前进,哪个循环跳过吗?