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来控制哪个循环前进,哪个循环跳过吗?