安全地从指针矢量中删除

Safely erasing from vector of pointers

本文关键字:删除 指针 安全      更新时间:2023-10-16

好吧,这可能是非常基本的,但我以前从未做过。

我有一个 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"。我做错了什么?有没有更好的方法?

怎么样:

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 保证在每个项目上只运行一次。

对于这种事情,您确实需要小心removeremove_if,因为删除的对象处于未定义状态,因此无法remove它们并在之后删除(您可以使用std::partition,但它更慢)。