C++STL库中的find_if的第三个参数只能是一元谓词(即只能传给一元谓词一个参数),但是在设计算法的过程中,需要第三个参数是二元谓词(即需要传给谓词函数两个参数),那么这时候就可以使用bind1st/bind2nd函数适配器,将二元谓词的某一个参数绑定为一个常数,这样二元谓词就变成了一元谓词,find_if只需要传给二元谓词一个参数就也能正常使用。
例如:
//找到数组中第一个大于40的元素
#include <functional>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int intArr[] = { 30, 90, 10, 40, 70, 50, 20, 80 };
const int N = sizeof(intArr) / sizeof(int);
vector<int> a(intArr, intArr + N);
vector<int>::iterator p = find_if(a.begin(), a.end(), bind2nd(greater<int>(), 40));
/*greater是二元谓词(函数对象有两个参数,只返回真或假),但是find_if的第三个参数只能是一元谓词,
为了将greater变为一元谓词,就需要使用find2nd函数适配器将greater的第二个参数绑定为常数40,
当find_if函数在遍历vector元素的迭代器时,就只需要传给greater一个参数就行了(即将迭代器所指向的
元素的值传给greater的第一个参数与第二个已绑定的参数40作比较,返回比较大小的结果为真或假)。*/
//注,greater有两个参数x、y,返回的是x>y为真或假
if (p == a.end())
cout << "no element greater than 40" << endl;
else
cout << "first element greater than 40 is: " << *p << endl;
return 0;
}
将二元谓词greater的第二个参数绑定为40,这样find_if只需要给greater传一个参数与40作比较就可以了(传入greater的参数就是遍历vector元素的迭代器所指向的元素的值)。