【发布时间】:2019-12-02 08:00:00
【问题描述】:
我有一个向量,它存储指向许多动态实例化的对象的指针,我正在尝试遍历向量并删除某些元素(从向量中删除并销毁对象),但我遇到了麻烦。这是它的样子:
vector<Entity*> Entities;
/* Fill vector here */
vector<Entity*>::iterator it;
for(it=Entities.begin(); it!=Entities.end(); it++)
if((*it)->getXPos() > 1.5f)
Entities.erase(it);
当任何实体对象达到 xPos>1.5 时,程序会因断言错误而崩溃... 有谁知道我做错了什么?
我正在使用 VC++ 2008。
【问题讨论】:
-
请用您使用的语言/环境标记您的问题,以便我们从主页知道您在使用什么(您将获得更多视图)。
-
但你不知道他在其余代码中对向量做了什么!一般来说,向量应该是首选容器,其他条件相同。
-
一般来说,你应该更喜欢 STL 算法而不是手写循环。
-
我同意这种特殊情况需要一个列表,但是在没有先验知识知道这个循环还需要做什么的情况下,现在很难推荐移动到一个列表。我建议的 STL 算法代码是 O(n)。显式循环 + 列表也是 O(n),但是您放弃了引用的局部性和随机访问,这很重要,我建议尽可能避免这种情况。我不同意算法不太清楚。它由一个简单的仿函数和三个步骤组成。如果一个程序员知道如何使用
,而且真的,每个c++程序员都应该知道,那么它很容易阅读。 -
为什么他妈的没有简单的“删除(元素)”方法,而是在我们必须放置这个愚蠢的 begin() 和 end() 调用的任何地方?
标签: c++ visual-c++ vector iterator erase