无法从C ++向量中删除元素

时间:2013-09-20 00:23:22

标签: c++ 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);
        }

    }

}

我完全错误地这样做了吗?这是我第一次真正使用向量而不仅仅是通过教程。如果我需要发布更多代码,请告诉我。过去几个小时我一直在研究这个问题,所以我有点急于让它发挥作用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

只要i元素是列表中的 last 元素,您就很容易进入未定义的行为。使用迭代器,并特别注意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;
        }
    }
}