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 );
- 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" 比较结果
- 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