对于以下代码,我遇到了一个奇怪的运行时错误:
#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;
}
错误提示:
向量擦除迭代器超出范围
答案 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从向量中弹出元素。