我目前遇到vector.erase()的问题.
vector<gameObject> gameObjects; for (auto it = gameObjects.end() - 1; it != gameObjects.begin();) { if ((it)->getDestroyed()) { it = gameObjects.erase(it); } else { --it; } }
所以gameObject是游戏中所有内容的基类,它有一个bool标志,基本上告诉我们对象是否被破坏.如果设置了标志,则应从向量中删除该标志.
class gameObject { protected: bool tobedestroyed; public: bool getDestroyed(); void markToDestroy(); };
现在第一个被破坏的对象被成功地从向量中移除然后我得到一个错误:迭代器不是可解除引用的,指向第73行(?)处的向量库.
然后我检查msvc调试器.在数据预览中,它显示迭代器指向gameObjects的最后/最新元素.然后将其删除(擦除(it))并且在数据预览不变的情况下,调用它 – > getDestroyed()会导致错误消息.
调试断言失败了!矢量迭代器不可解除引用.
PS:我检查了cplusplus.com,vector.erase应该返回一个新的,有效的迭代器,所以我不知道我在哪里弄乱它.
€:在我被告知擦除 – 移除成语后,我继续前进,最后得到以下内容,但不能编译.由于我的函数是gameObject的成员,我不知道如何成功调用remove_if.谢谢
gameObjects.erase(remove_if(gameObjects.begin(),gameObjects.end(),gameObject::getDestroyed),gameObjects.end());
€2:很多人指出第一个对象没有被检查.我应该指出这一点,但第一个元素始终是玩家,不应该删除.不过,谢谢你的评论.我会尝试一个简单的前进循环而不会太花哨^^.
€3:我尝试了Jonathan Mees建议的代码,但我得到了完全相同的错误消息.我会试着找出它到底发生了什么但是我不能再把断点放到擦除部分了.会有点乱.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。