c – 如何模拟remove_unless

前端之家收集整理的这篇文章主要介绍了c – 如何模拟remove_unless前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有代码从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?

解决方法

std :: not1假定你的函数对象将从std :: unary_function派生,或者至少提供相同的接口,因此它将为result_type和argument_type提供typedef.

由于lambda不会定义那些,因此您将无法在它们上使用not1.

显而易见的选择是创建类似于not1的东西,但是使用更现代的技术从它修改的任何内容中检测/传递参数/结果类型.

如果你真的想使用not1,那么最明智的方法是与std :: less和std :: bind进行比较,以指定你要比较的值(即,它基本上是C 03的东西),所以如果你要使用它,你可以用C 03的方式写出所有内容.

猜你在找的C&C++相关文章