【问题标题】:Why do I get a runtime error: Vector erase iterator outside range为什么会出现运行时错误:向量擦除迭代器超出范围
【发布时间】:2019-01-24 01:52:38
【问题描述】:

我遇到了以下代码的奇怪运行时错误:

#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;
}

错误提示:

向量擦除迭代器超出范围

我不是在解决像Ref1Ref2这样的问题,而是意识到问题的原因以及我是否做错了什么。

【问题讨论】:

  • @HenriMenke,我已修复 MWE 以创建相同的错误。
  • 好吧,我把我的反对票变成了赞成票:)

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


【解决方案1】:

正确的形式是

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多