我正试图从我的子弹矢量中删除“死”的子弹。每一帧,我都在调用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);
}
}
}
我完全错误地这样做了吗?这是我第一次真正使用向量而不仅仅是通过教程。如果我需要发布更多代码,请告诉我。过去几个小时我一直在研究这个问题,所以我有点急于让它发挥作用。
提前致谢!
答案 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;
}
}
}