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

C++ STL的find_if算法要求第三个参数为一元谓词,但实际需求可能需要二元谓词。通过bind1st/bind2nd函数适配器,可以将二元谓词的某一参数绑定为常数,从而使其适用于find_if。例如,将greater的第二个参数绑定为40,使find_if能用一元参数与40比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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元素的迭代器所指向的元素的值)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值