c++ - 嵌套循环,从 vector 中删除

标签 c++

我正在尝试制作简单的游戏,但遇到了小问题。所以我有两个指针 vector 。 一种用于子弹,一种用于敌方单位。 首先,我尝试迭代所有子弹,然后在第二个循环中迭代敌人,当我发现碰撞时,我删除敌方单位和子弹,但是删除子弹会破坏我的游戏,所以我发现我不应该从 vector 中删除它仍在第一个循环中迭代。

我的第二个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());

所以它似乎在某种程度上起作用,但我的子弹一次只能与一个敌人碰撞,而且似乎它没有检查所有敌人。例如,我发射了 5 颗子弹,首先它们只能与一个敌人发生碰撞,在一颗子弹杀死敌人后,其他子弹将能够与第二个敌人发生碰撞,依此类推。好像是这样的

for (std::vector<EnemyUnit*>::iterator it = enemyUnits.begin(); it != enemyUnits.end(); ++it)

没有发生并且只有一个敌人?是不是做法不对呢? 我需要使用指针和 vector ,因为它适合我的项目。

最佳答案

std::remove_if 的谓词无论如何,第一次检查后都会返回。

为了解决这个问题,谓词可以在发生冲突时返回,或者在冲突时返回,例如

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

return false;

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

关于c++ - 嵌套循环,从 vector 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66737158/

相关文章:

c++ - 当 Matlab 中仅接受 Int32Ptr 时,以字符串形式返回错误号

c++ - 具有嵌套结构/类的 POD 性

c++ - Qt GUI 开发 - 使用 QGraphicsView 显示 2D 网格

c++ - 具有自定义数据结构的 C++ 中的运算符<<

c++ - 用变量初始化 vector ,C++

c++ - 在 x64 中我们可以通过 malloc() 获得多少内存?

c++ - 这种 C++ 异常的使用是否合理

c++ - 我怎么知道临时对象何时被创建和销毁?

c++ - 将节点数组传递给函数并返回节点数组

c++ - 我们如何获得此输出 C++