c++ - 从指针 vector 中安全删除

标签 c++ vector iterator

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

我有一个 Particle vector ,当它们离开可见屏幕时,我想删除它们。我查找了 erase-remove 习语,但我不知道如何让它工作,因为我还需要删除 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 提示 “迭代器不能递减”。我究竟做错了什么?有没有更好的办法?

最佳答案

关于:

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,但速度较慢)。

关于c++ - 从指针 vector 中安全删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478511/

相关文章:

用于 Elasticsearch 的 C++ api

c++ - `auto` 之前是做什么用的?

c++ - 使用 boost c++ ublas 矩阵和 vector 类型进行元素运算

r - 将文本列转换为 r 中的向量

c++ - 没有合适的用户定义转换

c++ - 对象实例是否保持相同的内存地址

c++ - 无法在 C++ 中读取带有西里尔路径的文件

c++ - std::vector 何时重新分配其内存数组?

c++ - 默认构建的 map 迭代器在递增时进入无限循环 - Green Hills 编译器

c# - 如何在第一个枚举器中激活另一个枚举器