【发布时间】:2014-07-20 16:24:25
【问题描述】:
我做了一个游戏,兰博发射子弹,子弹击中僵尸,我想从僵尸向量中删除被击中的僵尸。
这个嵌套循环一个一个地检查每个僵尸和子弹之间的碰撞。它在一段时间内工作得很好,但是当我开始杀死更多时,在某些时候它会崩溃,因为它想使用擦除僵尸的功能。
for ( it = zombies.begin(); it != zombies.end(); ++it ) {
it->attack();
for (rambo.it = rambo.bullets.begin(); rambo.it != rambo.bullets.end(); ++rambo.it) {
if(checkBasicCollision(it,rambo.it) && it != zombies.end()){
zombies.erase(it);
}
}
}
我在zombies.erase(it); 之后添加了it--; 现在效果更好,但有时它仍然会崩溃。
我认为它的发生是这样的,例如有 5 个僵尸和 20 个子弹,僵尸迭代器在第二个僵尸处,第二个僵尸启动子弹循环以检查它是否被击中。循环开始,假设第三颗子弹击中僵尸,但循环仍在进行,即使僵尸被清除,它仍然继续循环。
我添加了中断;在zombies.erase(it); 之后,现在它没有任何问题。但是代码看起来很脏。是否有另一种方法可以轻松擦除当前元素
【问题讨论】:
-
任何时候你最终编写了从序列容器中删除的代码,同时迭代同一个序列容器,是时候重新考虑你想要完成的事情了。您应该努力不编写从您正在迭代的同一容器中删除的代码。相反,尽可能使用
remove(if)/erase成语。您不仅会减少使迭代器失效的问题(通常没有问题),而且您已将代码重构为“逻辑上”您想要完成的内容。 -
为什么不将僵尸存储在一个列表中呢?
-
顺便问一下
rambo.it的兴趣是什么?看起来这应该是一个临时变量。