0

在此代码片段中,Update() 返回一个布尔值,如果它返回 false,我想从向量中删除该元素。

但是,这会产生调试断言失败的运行时错误。表达式是“向量迭代器不可递增”。

编码:

for(auto iter = someVector.begin(); iter != someVector.end(); ++iter){
    if(!iter->get()->Update()) iter = someVector.erase(iter);
}

我也尝试从迭代器中减去如下:

for(auto iter = particles.begin(); iter != particles.end(); ++iter){
    if(!iter->get()->Update()) iter = --(particles.erase(iter));
}

...但这会导致“向量迭代器不可递减”。

如何使我的代码按预期工作;以便当 Update() 函数返回 false 时删除向量元素?

4

2 回答 2

5

将循环更改为:

for(auto iter = someVector.begin(); iter != someVector.end();){
    if(!iter->get()->Update())
        iter = someVector.erase(iter);
    else
        ++it;
}

断言的原因是,在调用 之后eraseiter可能等于end()。返回的迭代器erase已经是“下一个”,你不应该增加它。

于 2013-08-17T19:08:29.003 回答
1

我建议不要首先使用erase()上面的方法,而是像这样使用它:

someVector.erase(std::remove_if(someVector.begin(), someVector.end(),
                                [](decltype(*someVector.begin()) element){
                                    return !element.get()->update();
                                },
                 someVector.end());

当只需要删除一个元素时,它与使用一个迭代器版本的erase(). 当需要擦除多个元素时,它会减少复制/移动。请注意,我使用 lambda 函数只是因为它更容易表达,但如果 lambda 函数不可用,也可以使用合适的函数对象来完成。

于 2013-08-17T19:16:37.557 回答