我正在尝试从我的子弹 vector 中删除“死”子弹。每帧,我都调用Bullet::update()函数,如下所示:

    void Bullet::update()
{
    for(int i = 0; i != mAmmo.size(); i++)
    {
        if(mAmmo[i].sprite.getPosition().x > 700)
            mAmmo[i].mAlive = false;
        if(mAmmo[i].mAlive == false)
        {
// I get a Debug Assertion Failed at runtime from this piece of code
            mAmmo.erase(mAmmo.begin()+i);
        }

        if(mAmmo[i].mAlive == true)
        {
            mAmmo[i].sprite.move(mMovement);
        }

    }

}

我完全不正确地这样做吗?这是我第一次真正真正使用 vector ,而不仅仅是通过教程。如果我需要发布更多代码,请告诉我。在过去的几个小时中,我一直在努力进行这项工作,因此,我迫切希望将其付诸实践。

提前致谢!

最佳答案

只要i th元素是列表中的最后一个元素,您就很容易进入 undefined 的行为。使用迭代器,并特别注意 erase() 的返回值,因为它会自动为您推进迭代器,因此您的循环不必这样做。

void Bullet::update()
{
    for (auto it = mAmmo.begin(); it != mAmmo.end();)
    {
        if(it->sprite.getPosition().x > 700)
            it->mAlive = false;

        if (!it->mAlive)
        {
            // erase and get next iterator
            it = mAmmo.erase(it);
        }
        else
        {   // move and increment
            it->sprite.move(mMovement);
            ++it;
        }
    }
}

10-08 11:36