好吧,这可能是非常基本的,但我以前从未这样做过。
我有Particle
s的向量,当它们离开可见屏幕时,我想要删除它们。我查找了删除删除的习语,但我不知道如何使其工作,因为我还需要删除Particle
个实例。我尝试了向后迭代,没有成功:
for ( std::vector<Particle*>::reverse_iterator rit = particles.rbegin(); rit != particles.rend(); ++rit )
{
if ( IsOffScreen((*rit)->pos) )
{
delete (*rit.base());
particles.erase(rit.base());
}
}
在运行时崩溃时,Visual Studio会说"iterator cannot be decremented"
。我究竟做错了什么?还有更好的方法吗?
答案 0 :(得分:1)
怎么样:
for (std::vector<Particle*>::iterator it = particles.begin(); it != particles.end(); ++it) {
if (IsOffScreen((*it)->pos)) {
delete *it;
*it = NULL;
}
}
particles.erase(std::remove(particles.begin(), particles.end(), NULL), particles.end());
还有其他各种选项 - 您可以在谓词中删除它们,例如,因为IIRC保证在每个项目上只运行一次。
对于此类事情,您需要小心remove
和remove_if
,因为删除的对象处于未定义状态,因此无法remove
它们并删除之后(你可以使用std::partition
,但速度较慢)。