我有代码从std :: vector< int>中删除所有元素小于某个int限制.我写了一些部分应用lambdas的函数:
auto less_than_limit = [](int limit) { return [=](int elem) { return limit > elem; }; }; auto less_than_three = less_than_limit(3);
当我用std :: vector< int>进行测试时v {1,2,3,4,5} ;,我得到了预期的结果:
for(auto e: v) { std::cout << less_than_three(e) << " "; } // 1 1 0 0 0
我可以轻松删除少于三个的所有元素:
auto remove_less_than_three = std::remove_if(std::begin(v),std::end(v),less_than_three); v.erase(remove_less_than_three,v.end()); for(auto e: v) { std::cout << e << " "; } // 3 4 5
如何使用less_than_three删除大于或等于3的元素?
我尝试在std :: not1中包装less_than_three,但是出现了错误:
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:742:11: error: no type named 'argument_type' in 'struct main()::<lambda(int)>::<lambda(int)>' class unary_negate ^ /usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:755:7: error: no type named 'argument_type' in 'struct main()::<lambda(int)>::<lambda(int)>' operator()(const typename _Predicate::argument_type& __x) const /usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/predefined_ops.h:234:30: error: no match for call to '(std::unary_negate<main()::<lambda(int)>::<lambda(int)> >) (int&)' { return bool(_M_pred(*__it)); } ^
然后我尝试了std :: not1(std :: ref(less_than_three)),但是遇到了这些错误:
/usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:742:11: error: no type named 'argument_type' in 'class std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> >' class unary_negate ^ /usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/stl_function.h:755:7: error: no type named 'argument_type' in 'class std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> >' operator()(const typename _Predicate::argument_type& __x) const ^ /usr/local/Cellar/gcc/5.3.0/include/c++/5.3.0/bits/predefined_ops.h:234:30: error: no match for call to '(std::unary_negate<std::reference_wrapper<main()::<lambda(int)>::<lambda(int)> > >) (int&)' { return bool(_M_pred(*__it)); } ^
如何在不改变lambdas逻辑的情况下否定std :: remove_if中的函数?换句话说,我怎样才能模仿remove_unless?