基于条件语句删除循环中的向量元素

时间:2013-08-17 19:04:40

标签: c++ vector iterator

在此代码片段中,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时删除vector元素?

2 个答案:

答案 0 :(得分:5)

将循环更改为:

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

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

答案 1 :(得分:1)

我建议首先使用{strong>不使用erase(),而是使用类似这样的内容:

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

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