为什么会出现运行时错误:向量擦除迭代器超出范围

时间:2018-08-17 04:14:58

标签: c++ c++11 stl stdvector

对于以下代码,我遇到了一个奇怪的运行时错误:

#include <algorithm>
#include <vector>

using std::vector;

struct Data
{
    int id;
};

int main()
{
    vector<Data> mylist;

    Data m;
    m.id = 10;

    mylist.push_back(m);

    mylist.erase(std::remove_if(
        mylist.begin(),
        mylist.end(),
        [](const Data &m) {
        return m.id>100;
    }));

    return 0;
}

错误提示:

  

向量擦除迭代器超出范围

Screenshot

我不是在解决Ref1Ref2之类的问题之后,而是意识到问题的原因以及我做错了什么。

2 个答案:

答案 0 :(得分:3)

正确的格式是

mylist.erase(
    std::remove_if(mylist.begin(),mylist.end(),lambda),
    mylist.end());

您还需要将end传递给擦除。

答案 1 :(得分:2)

在上面的示例中, remove_if 函数模板将返回无效的迭代器。现在,根据std::vector::erase的文档,迭代器pos必须有效且可取消引用,在您的情况下这是无效的,并且因此引发断言消息。

或者,您可以仅将end()迭代器作为std::vector::erase函数的第二个参数,或使用std::vector::pop_back从向量中弹出元素。