C++ 仿函数

仿函数定义 

 仿函数本质上就是类+operator()

看上去仿佛是函数 实际是类

仿函数比函数更灵活 有自己的数据和成员变量

仿函数可以当作参数传递

仿函数比函数指针执行的更快(大多数情况下)

仿函数可以当作模板使用,因为每个仿函数都拥有自己的类型

仿函数返回值类型是bool数据类型 称为谓词

如果operator接受一个参数  就是一元谓词

接收两个参数就是二元谓词

缺点在于定义的时候需要定义在一个类里面

#include<iostream>
using namespace std;
class Print
{
public:
	int operator()(int a)
	{
		cout << a <<" "<<++count << endl;
		return a;
	}
private:
	int count = 0;
};

//作为参数传递
Print add(Print a)
{
	return a;
}

template<class Brin>
Brin bdd(Brin a)
{
	return a;
}

template<class Crin>
Crin cdd(Crin a)
{
	return a;
}


int main(void)
{
	Print aaa;
	int a = 4;
	aaa(a);
//作为参数传递
	add(aaa);
	bdd<Print>(aaa);
	cdd(aaa);
	return 0;
}

我们在有些情况下 必须要用仿函数

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{
	}

	bool operator<(const Date& d)const
	{
		return (_year < d._year) ||
			(_year == d._year && _month < d._month) ||
			(_year == d._year && _month == d._month && _day < d._day);
	}

	bool operator>(const Date& d)const
	{
		return (_year > d._year) ||
			(_year == d._year && _month > d._month) ||
			(_year == d._year && _month == d._month && _day > d._day);
	}

	friend ostream& operator<<(ostream& _cout, const Date& d);
private:
	int _year;
	int _month;
	int _day;
};

struct LessPDate
{
	bool operator()(const Date* p1, const Date* p2)
	{
		return *p1 < *p2;
	}
};

		void test_priority_queue2()
	{

		priority_queue<Date*, vector<Date*>, LessPDate> pq;
		pq.push(new Date(2023, 7, 20));
		pq.push(new Date(2023, 6, 20));
		pq.push(new Date(2023, 8, 20));

		while (!pq.empty())
		{
			cout << *pq.top() << " ";
			pq.pop();
		}
		cout << endl;
	}
}



int main(void)
{
	bit::test_priority_queue2();
	return 0;
}

像这个地方我们对于Date*这个类型

我们不可能去重载操作符

因为Date*是内置类型

但是我每次new的地址的大小是随机的

因此我们在这个地方要根据Date大小去建堆就只能自己写一个仿函数了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值