C++ 参数绑定bind1st, bind2nd

std::bind
之前这篇文章已经讲过C++ 参数绑定bind(适用于C++11以后),参见 C++ Primer学习笔记 - 参数绑定bind

using namespace placeholders;
// or using std::placeholders::_1;

auto f = bind(f0, _1, 2); // 生成一个新的函数对象f,_1代表传给f的第一个实参,2是整型数字。这里_1和2的顺序,决定了f0调用时的参数排列顺序
// 调用f(x)等价于
f0(_1, 2);

bind1st和bind2nd
今天,我们讲一讲bind1st和bind2nd。两者在C++11中均已不推荐使用,C++17中已经移除。

  • 原型
#include <functional>

template< class F, class T >
std::binder1st<F> bind1st( const F& f, const T& x );

template< class F, class T >
std::binder2nd<F> bind2nd( const F& f, const T& x );
  1. bind1st

bind1st是绑定f的第一个参数到x:

std::binder1st<F>(f, typename F::first_argument_type(x))
// f是函数对象,x是实参

也就是说,

auto f = std::bind1st(less<int>(), 2);
// 等价于
auto f = std::bind(less<int>(), 2, _1);

// 调用f(y),等价于调用
less<int>()(2, y); // 返回 "2 < y" 比较结果
  1. bind2nd

bind2nd是绑定f的第二个参数到x:

std::binder2nd<F>(f, typename F::second_argument_type(x)).

也就是说,

auto f = std::bind2nd(less<int>(), 2);
// 等价于
auto f = std::bind(less<int>(), _1, 2);

// 调用f(y),等价于调用
less<int>()(y, 2); // 返回 "y < 2" 比较结果
  • 示例
    找到vector容器中,第一个小于2的元素,以及第一个大于2的元素
vector<int> vec = {5,6,7,1,2,9,4,8,10,3};
sort(vec.begin(), vec.end(), less<int>()); // 升序排序

auto *p1 = find_if(vec.begin(), vec.end(), bind2nd(less<int>(), 2)); // ? < 2, 第一个小于2的元素
cout << *p1 << endl; // 打印1
auto *p2 = find_if(vec.begin(), vec.end(), bind1st(less<int>(), 2)); // 2 < ?, 第一个大于2的元素
cout << *p2 << endl; // 打印3

参见 std::bind1st, std::bind2nd | cppreference

posted @ 2021-12-28 16:15  明明1109  阅读(758)  评论(0编辑  收藏  举报