今天我们先来谈谈C++ 标准库里面的绑定器bind1st
,bind2nd
和函数对象function
一、绑定器
虽然在C++11标准中这两个绑定函数已经被弃用,但仍然值得我们深入思考其底层原理。从字面上理解,“绑定” 这两个字表明它可能将某个类型或值直接关联到了某个特定的 “位置” 上,其定义可以被概括为:
-
🐶bind1st函数接受一个二元函数和一个值,返回一个新的函数对象,该函数对象将被绑定到二元函数的第一个参数上。这意味着第二个参数可以在调用时提供,而第一个参数是预先绑定的。
-
🐱bind2nd函数接受一个二元函数和一个值,返回一个新的函数对象,该函数对象将被绑定到二元函数的第二个参数上。这意味着第一个参数可以在调用时提供,而第二个参数是预先绑定的。
简而言之,bind1st
把函数对象 operator()
重载函数的第一个形参变量绑定成一个确定的值,而bind2nd
函数则是把第二个形参变量绑定成一个确定的值。下面我们给出一个简单的示例来加深理解:
#include<iostream>
#include<functional>
#include<vector>
using namespace std;
template<typename T>
void show_all(T& val) //通用函数模板,用来输出所有元素
{
typename T::iterator it = val.begin();
while (it != val.end())
{
cout << *it << " ";
it++;
}
}
int main()
{
srand(time(NULL));
vector<int> v;
for (int i = 0; i < 20; i++)
v.push_back(rand() % 100);
//v.push_back(rand() % 100 + 50); 一定找不到
// 使用 bind1st(greater<int>(), 50) 查找第一个大于50的元素
auto it = find_if(v