C++ 嵌套循环,从向量中删除

C++ 嵌套循环,从向量中删除,c++,C++,我正在尝试做一个简单的游戏,我遇到了一个小问题。我有两个指针向量。 一个是子弹,一个是敌人的单位。 首先,我试着遍历我所有的子弹,然后在第二个循环中遍历我的敌人,当我发现碰撞时,我擦除敌人的单位和子弹,但是擦除子弹会破坏我的游戏,所以我发现我不应该在向量还在第一个循环中迭代时从向量中擦除 我的第二个ide是这样的: std::vector<Bullet*>::iterator remove = std::remove_if(bullets.begin(), bullets.end()

我正在尝试做一个简单的游戏,我遇到了一个小问题。我有两个指针向量。 一个是子弹,一个是敌人的单位。 首先,我试着遍历我所有的子弹,然后在第二个循环中遍历我的敌人,当我发现碰撞时,我擦除敌人的单位和子弹,但是擦除子弹会破坏我的游戏,所以我发现我不应该在向量还在第一个循环中迭代时从向量中擦除

我的第二个ide是这样的:

std::vector<Bullet*>::iterator remove = std::remove_if(bullets.begin(), bullets.end(),
        [&](Bullet* x)
    {
        for (std::vector<EnemyUnit*>::iterator it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
        {
            if (x->collision->CheckCollision((*it)->collision))
            {
                enemyUnits.erase(it);

                return true;
                
            }
            else
            {
                return false;
            }
        }
    });
    bullets.erase(remove, bullets.end());
std::vector::iterator remove=std::remove_if(bullets.begin(),bullets.end(),
[&](项目符号*x)
{
对于(std::vector::iterator it=enemyUnits.begin();it!=enemyUnits.end();+it)
{
如果(x->碰撞->检查碰撞((*it)->碰撞))
{
灌肠单位。擦除(它);
返回true;
}
其他的
{
返回false;
}
}
});
项目符号。擦除(删除,项目符号。结束());
所以它似乎在某种程度上起作用,但我的子弹一次只能与一个敌人相撞,而且它似乎没有检查所有敌人。例如,我射出5发子弹,首先它们只能与一个敌人相撞,在一发子弹杀死敌人后,其他子弹将能够与第二个敌人相撞,依此类推。好像

for (std::vector<EnemyUnit*>::iterator it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
for(std::vector::iterator it=enemyUnits.begin();it!=enemyUnits.end();++it)
没有发生,只有一个敌人?这样做是错误的吗?
我需要使用指针和向量,因为它适用于我的项目。

删除返回语句的答案建议是正确的。return语句很早就退出了内部循环,但这不是唯一的问题。删除这些返回将揭示下一个问题。你需要:

it=enemyUnits.erase(它)

在擦除后正确设置迭代器,以准备下一次通过循环。

无论发生什么情况,第一次检查后返回的谓词

为了解决这个问题,谓词可以在发生冲突时返回,也可以在结束时(在循环之后)不发生冲突时返回,例如

for (auto it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
{
    if (x->collision->CheckCollision((*it)->collision))
    {
        enemyUnits.erase(it);
        return true;
    }
}

return false;
这样,如果检测到碰撞,它将提前退出并返回true。
如果没有与任何敌人发生碰撞,它将在循环后停止并返回false。

要做的一件事是为(EnemyUnit*it:enemyUnits){}使用更好的循环
从Python中,敌人的基本上是C++的等价于<代码>的代码。这可以通过在所讨论的问题的评论中提到的不同的循环来固定。现代循环语法
it:enemyUnits
确实不需要在这种情况下重置迭代器,因为容器是一个向量,指向项的指针可以用作迭代器。我指出这一点是因为这是原始代码中的一个缺陷,因此有机会解释一下。erase()返回一个迭代器。另外,为了解释一般情况,因为std::list或其他容器需要在擦除后设置迭代器。我仍然有问题,因为我无法删除return,因为我正在使用std::remove_,如果必须返回true才能记住要删除的项目符号,那么lambda必须保留一个状态变量来跟踪是否有任何命中。延迟返回直到完成内部for循环。好的,我想我已经成功了,非常感谢你的帮助