C++函数对象

  • 函数对象。本质是一个对象,但是使用和函数一样,因为函数对象重载了()运算符。
  • 函数对象和泛型算法结合使用

排序比较器

less

" < "

template<typename T>
class Mless
{
public:
	bool operator()(T a, T b)
	{
		cout << "operator()" << endl;
		return a < b;
	}
};

greater

" >"

template<typename T>
class Mgreater
{
public:
	bool operator()(T a, T b)
	{
		cout << "operator()" << endl;
		return a > b;
	}
};

绑定器

  • 绑定器的作用就是给函数对象绑定参数
  • 绑定器自身就是一个对象
  • 绑定器想要给函数对象把参数绑定起来,因此就需要先将函数对象存起来;再将需要绑定的参数存起来
  • 按照函数对象相同的方式,绑定器自己也变成一个函数对象,当绑定器自己的函数对象被调用时,再把传进来的函数对象进行调用,拿来调用的同时把需要绑定的值放在需要绑定的位置,另外的参数由外界传进来

bind1st

自实现myBinder1st()

bind2nd

	//                                                       <       10
	//                                                      调用binder2nd的构造函数,构造一个对象传递给find_if 
	//                                                       binder2nd构造函数有2个参数:less函数对象;需要进行比较的值
	vector<int>::iterator it1=find_if(v1.begin(), v1.end(), binder2nd <less<int>>(less<int>(), 12));
	//                           binder2nd:是一个模板,意思是绑定对象的第二个参数
	//                           绑定less对象的第二个参数,因为less是函数对象,是2个参数的函数对象
	//                           使用binder2nd给less函数对象绑定第二个参数为10
	if (it1 == v1.end())
	{
		cout << " not find " << endl;
	}
	else
	{
		cout << *it1 << endl;
	}

标准库里的less

在这里插入图片描述

自实现myBinder2nd()

template<typename T>
class Myless
{
public:
	typedef T TYPE_FIRST;
	typedef T TYPE_SECOND;
	typedef bool TYPE_RET;
	bool operator()(T a, T b)
	{
		cout << "operator()" << endl;
		return a < b;
	}
};


template<typename PRE>
class myBinder2nd//绑定器的作用就是给函数对象绑定参数
{
public:
	myBinder2nd(PRE pre, typename PRE::TYPE_SECOND val)//第一个参数是函数对象,第二个参数是一个未知类型的值
		:_pre(pre),_val(val)
	{
	}
	typename PRE::TYPE_RET operator()(typename PRE::TYPE_FIRST tmp)//因为使用到的是模板里面的类型所以需要加typename
	{
		//cout << "operator()" << endl;
		return _pre(tmp, _val);
	}

private:
	PRE _pre;//函数对象
	typename PRE::TYPE_SECOND _val;
};



template<typename IT, typename PRE>
IT myFind_if(const IT& first, const IT& last, PRE pre)
{
	IT tmp = first;
	while (tmp != last)
	{
		if (pre(*tmp))
		{
			return tmp;
		}
		tmp++;
	}
	return last;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值