C++ 常用操作的标准一元函数

C++ 常用操作的标准一元函数,c++,C++,是否有理由不使用二进制函数的一元版本 我知道使用std::bind创建一元版本很简单,但代码看起来很难看: std::find_if(std::begin(v), std::end(v), std::bind(std::less_equal<int>(), std::placeholders::_1, 42)); std::find_if(std::begin(v)、std::end(v)、std::bind(std::less_equal()、std::占位符::_1,42));

是否有理由不使用二进制函数的一元版本

我知道使用
std::bind
创建一元版本很简单,但代码看起来很难看:

std::find_if(std::begin(v), std::end(v), std::bind(std::less_equal<int>(), std::placeholders::_1, 42));
std::find_if(std::begin(v)、std::end(v)、std::bind(std::less_equal()、std::占位符::_1,42));
我想最好有这样的东西:

std::find_if(std::begin(v), std::end(v), std::less_equal<int>(42));
std::find_if(std::begin(v)、std::end(v)、std::less_equal(42));

自C++11/14以来,lambda如何使这种谓词变得多余

find_if(begin(v), end(v), [](auto x){ return x <= 42; });

find_if(begin(v),end(v),[](auto x){return x我认为没有技术上的理由不允许使用第二种方法。在弃用之前,
std::bind2nd
helper函数将非常接近您想要的方法:

std::find_if(std::begin(v), std::end(v), std::bind2nd(std::less_equal<int>(), 42));

使用你自己的包装器()。

给一个lambda起个名字怎么样

const auto cmp_less_eq = [](auto x){ return x <= 42; };
const auto result = find_if(begin(v), end(v), cmp_less_eq);

const auto cmp_less_eq=[](auto x){return x使用lambdas并没有那么糟糕。@我仍然认为使用名称比使用lambdass更可读,同时支持一元函数和二元函数可能会令人困惑。@Felics大体上我同意你的看法。但是在这个表达式中std::less_equal(42)不清楚42是否是比较的右操作数的左边。如果我想让42在左边呢?我们是否需要为每个二进制操作数使用两个一元函数?我们如何调用它们?我不这么认为。使用函数对象的有意义的全名而不是lambda可以使代码更可读和清晰,因为函数的名称al object是众所周知的。我有点同意@VladfromMoscow的观点,它更容易理解命名对象的意图functions@VladfromMoscow多数情况下同意:)!我个人的偏好是lambdas用于任何小于1或2行的特殊功能;命名函数用于所有其他功能;从我的角度来看,必须记住X个一元谓词比必须记住一个常见机制要麻烦得多;但是lambdas在变大时可能会变得复杂,难以阅读和理解;是的,这是一个选项,但标准库的整体思想是提供通用功能,即使它确实很容易实现。标准库中有许多单行程序的示例,只是因为它们碰巧经常被使用。我不想争论什么应该/不应该在标准中。我只是想提供一种解决您的问题的方法:-)我的问题更多的是关于在标准库中省略此功能的原因,而不是为了解决问题,是的,我认为这是一个比我用作示例的绑定解决方案更优雅的解决方案。+1:)
std::find_if(std::begin(v), std::end(v), cmp_less_equal(42));
const auto cmp_less_eq = [](auto x){ return x <= 42; };
const auto result = find_if(begin(v), end(v), cmp_less_eq);