c++ - 如何从使用 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 都是类。
解决方案
您应该将 for 循环分成两部分:
- 删除所有“命中”元素:
object_list.erase(std::remove_if(object_list.begin(),
object_list.end(), [](auto&& item) { return item.hit(); }),
object_list.end());
- 绘制剩余:
std::for_each(object_list.begin(), object_list.end(), [](auto&& item) { item.draw(); });
它更安全,更具可读性。
推荐阅读
- javascript - CSS 'ch' 单元的意外行为
- javascript - React Router v5.2 - 使用 createBrowserHistory 和 history.block 阻止路由更改
- karate - 请求“带有工作示例”以将 config.js 中的参数调用到 Karate-DSL 中的功能
- java - 如何通过严格遵循给定的 UML 在子类中定义字段?
- javascript - 尝试访问生成的 SVG 元素
- javascript - 通过 JS 在 HTML 中添加输入标签并在 JS 中增加输入 id
- python - 如何在 Python 中使这段代码更快?
- struct - GDB:在结构中显示不正确的值
- android - 如何分享未完成的 Flutter 应用以供审核?
- firebase - 为什么在 firebase 连接期间 int map 操作出现错误?as String' 不是 'int' 类型的子类型