首页 文章

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

提问于
浏览
0

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

但是,这会导致调试断言的运行时错误失败 . 表达式是“矢量迭代器不可递增” .

The code:

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

I have tried subtracting from the iterator as follows too:

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

...但这导致“矢量迭代器不可减少” .

How can I make my code works as intended; so that the vector element is deleted when the Update() function returns false?

2 回答

  • 1

    将循环更改为:

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

    断言的原因是,在调用 erase 之后, iter 可能等于 end() . erase 返回的迭代器已经"next",你不应该增加它 .

  • 5

    我首先推荐 not 使用 erase() 如上所述,而是使用类似这样的东西:

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

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

相关问题