我有以下设置
//Create a set which orders the elements according to their size.
auto comp = [](const vector<int>& a, const vector<int>& b) -> bool
{
if (a.size() < b.size())
return true;
if (a.size() > b.size())
return false;
return a < b;
};
auto path = std::set <vector<int>, decltype(comp)> (comp);
和以下载体。
vector<int> nodePath;
我想删除集合中所有大小大于nodePath向量大小的元素。
path.erase(std::remove_if(path.begin(), path.end(),
[](vector<int> task) { return task.size()>nodePath.size(); }), path.end());
当我执行这样的程序时,他抛出:
main.cpp: In lambda function:
main.cpp:347:93: error: ‘nodePath’ is not captured
[](vector<int> task) { return task.size()>nodePath.size(); }), path.end());
^~~~~~~~
main.cpp:347:52: note: the lambda has no capture-default
[](vector<int> task) { return task.size()>nodePath.size(); }), path.end());
^
main.cpp:285:29: note: ‘std::vector<int> nodePath’ declared here
vector<int> nodePath;
如果我将nodePath向量放在[]中,他将抛出:
In file included from /usr/include/c++/6.1.1/algorithm:62:0,
from main.cpp:7:
/usr/include/c++/6.1.1/bits/stl_algo.h: In instantiation of ‘_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = std::_Rb_tree_const_iterator<std::vector<int> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<run(int*, char***)::<lambda(std::vector<int>)> >]’:
/usr/include/c++/6.1.1/bits/stl_algo.h:936:30: required from ‘_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = std::_Rb_tree_const_iterator<std::vector<int> >; _Predicate = run(int*, char***)::<lambda(std::vector<int>)>]’
main.cpp:347:119: required from here
/usr/include/c++/6.1.1/bits/stl_algo.h:868:16: error: passing ‘const std::vector<int>’ as ‘this’ argument discards qualifiers [-fpermissive]
*__result = _GLIBCXX_MOVE(*__first);
答案 0 :(得分:1)
std::remove_if()
不能与套装一起使用。
从集合中删除值的唯一方法是使用erase()
方法。
std::remove_if()
通过逐字复制它们来删除序列中的值,并返回新序列的结束迭代器值。使用结束迭代器值调用erase()
,但这还不够。
std::remove_if()
旨在与序列容器一起使用,例如std::vector
或std::list
,您可以通过复制它们来删除单个元素。但这不适用于std::set()
,因为std::remove_if()
对集合erase()
方法一无所知,这是从集合中删除值的唯一方法。
您需要编写自己的代码来正确迭代集合,并删除要删除的值。
注意最常见的陷阱:从集合中删除元素后,刚刚删除的迭代器不再有效。