??C++STL庫中的find_if的第三個(gè)參數(shù)只能是一元謂詞(即只能傳給一元謂詞一個(gè)參數(shù))邀杏,但是在設(shè)計(jì)算法的過程中贫奠,需要第三個(gè)參數(shù)是二元謂詞(即需要傳給謂詞函數(shù)兩個(gè)參數(shù)),那么這時(shí)候就可以使用bind1st/bind2nd函數(shù)適配器望蜡,將二元謂詞的某一個(gè)參數(shù)綁定為一個(gè)常數(shù)唤崭,這樣二元謂詞就變成了一元謂詞,find_if只需要傳給二元謂詞一個(gè)參數(shù)就也能正常使用脖律。
??例如:
//找到數(shù)組中第一個(gè)大于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是二元謂詞(函數(shù)對象有兩個(gè)參數(shù)浩姥,只返回真或假),但是find_if的第三個(gè)參數(shù)只能是一元謂詞状您,
為了將greater變?yōu)橐辉^詞勒叠,就需要使用find2nd函數(shù)適配器將greater的第二個(gè)參數(shù)綁定為常數(shù)40,
當(dāng)find_if函數(shù)在遍歷vector元素的迭代器時(shí)膏孟,就只需要傳給greater一個(gè)參數(shù)就行了(即將迭代器所指向的
元素的值傳給greater的第一個(gè)參數(shù)與第二個(gè)已綁定的參數(shù)40作比較眯分,返回比較大小的結(jié)果為真或假)。*/
//注柒桑,greater有兩個(gè)參數(shù)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的第二個(gè)參數(shù)綁定為40魁淳,這樣find_if只需要給greater傳一個(gè)參數(shù)與40作比較就可以了(傳入greater的參數(shù)就是遍歷vector元素的迭代器所指向的元素的值)飘诗。