首页 > 解决方案 > 如何从使用 for 循环中的向量大小的向量中删除元素

问题描述

我有一个游戏,我向一个物体射击子弹,然后我删除被子弹击中的物体和屏幕外的子弹。

例如:

std::vector<object> object_list;
for(size_t i = 0; i < object_list.size(); i++)
{

    if(object_list[i].hit())
    {
        object_list.erase(object_list.begin() + i);
    }
    else
        object_list[i].draw();
}

这样做的问题是,当我删除一个对象时,向量的大小会减小,因此当它检查条件时,它会失败并且我会收到诸如“向量下标超出范围”之类的错误。我可以选择不通过渲染那些没有被击中的小行星来渲染小行星,但问题是没有。当被击中(分裂)时,物体的数量会增加,所以最终程序会变慢。我对屏幕外的子弹使用了类似的概念,但我找不到解决方法。我正在寻找解决此问题或删除元素的更好方法。

object 和 bullet 都是类。

标签: c++vector

解决方案


您应该将 for 循环分成两部分:

  1. 删除所有“命中”元素:
object_list.erase(std::remove_if(object_list.begin(), 
object_list.end(), [](auto&& item) { return item.hit(); }),
object_list.end());
  1. 绘制剩余:
std::for_each(object_list.begin(), object_list.end(), [](auto&& item) { item.draw(); });

它更安全,更具可读性。


推荐阅读