做到这一点的“正确”方法是使用算法:
#include <algorithm>
#include <functional>
// this is a function object to delete a pointer matching our criteria.
struct entity_deleter
{
void operator()(Entity*& e) // important to take pointer by reference!
{
if (e->GetXPos() > 1.5f)
{
delete e;
e = NULL;
}
}
// now, apply entity_deleter to each element, remove the elements that were deleted,
// and erase them from the vector
for_each(Entities.begin(), Entities.end(), entity_deleter());
vector<Entity*>::iterator new_end = remove(Entities.begin(), Entities.end(), static_cast<Entity*>(NULL));
Entities.erase(new_end, Entities.end());
现在我知道你在想什么了。您认为其他一些答案更短。但是,(1)这种方法通常编译成更快的代码——尝试比较它,(2)这是“正确的”STL方式,(3)出现愚蠢错误的机会更少,(4)更容易阅读一旦你可以阅读 STL 代码。学习 STL 编程非常值得,我建议您查看 Scott Meyer 的巨著“Effective STL”,其中包含有关此类内容的大量 STL 技巧。
另一个重要的一点是,通过在操作结束之前不擦除元素,元素不需要被打乱。GMan 建议使用列表来避免这种情况,但是使用这种方法,整个操作是 O(n)。相比之下,Neil 上面的代码是 O(n^2),因为搜索是 O(n),而删除是 O(n)。