【C++】在函数对象参数只能是一元谓词的情况下,如何使用二元谓词

  C++STL库中的find_if的第三个参数只能是一元谓词(即只能传给一元谓词一个参数),但是在设计算法的过程中,需要第三个参数是二元谓词(即需要传给谓词函数两个参数),那么这时候就可以使用bind1st/bind2nd函数适配器,将二元谓词的某一个参数绑定为一个常数,这样二元谓词就变成了一元谓词,find_if只需要传给二元谓词一个参数就也能正常使用。

  例如:

//找到数组中第一个大于40的元素
#include 
#include 
#include 
#include 
using namespace std;

int main() {
    int intArr[] = { 30, 90, 10, 40, 70, 50, 20, 80 };
    const int N = sizeof(intArr) / sizeof(int);
    vector a(intArr, intArr + N);
    vector::iterator p = find_if(a.begin(), a.end(), bind2nd(greater(), 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元素的迭代器所指向的元素的值)。

你可能感兴趣的:(【C++】在函数对象参数只能是一元谓词的情况下,如何使用二元谓词)