自定义类型比较三种解决方法

1.函数运算符重载

// 小堆,需要调用头文件functional
#include <functional>
void Testpriority_queue()
{
	priority_queue<int, vector<int>, greater<int>> q; // 这里要表示小堆的话,就必须三个参数都写,否则编译失败
	q.push(4);
	q.push(5);
	q.push(1);
	q.push(2);
	q.push(9);
	q.push(8);
	q.push(7);

	cout << q.size() << endl;
	cout << q.top() << endl;
}

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


	 自定义类型的Date默认不能进行比较,必须给出方法
	 第一种:运算符重载
	bool operator<(const Date& d)const
	{
		return _day < d._day;
	}

	bool operator>(const Date& d)const
	{
		return _day > d._day;
	}

private:
	size_t _year;
	size_t _month;
	size_t _day;
};



void Test1()
{
	Date d1(2020, 5, 6);
	Date d2(2020, 5, 7);
	Date d3(2020, 5, 8);

	// priority_queue<Date> p; // 大堆
	priority_queue<Date, vector<Date>, greater<Date>> p; // 小堆
	p.push(d1);
	p.push(d2);
	p.push(d3);
}

2.函数指针

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


	friend bool IsLess(const Date& left, const Date& right);
private:
	size_t _year;
	size_t _month;
	size_t _day;
};

// 第二种方法:函数指针
bool IsLess(const Date& left, const Date& right)
{
	return left._day < right._day;
}

typedef bool(*Less)(const Date& left, const Date& right);


// 小堆
//bool IsGreater(const Date& left, const Date& right)
//{
//	return left._day > right._day;
//}
//
//typedef bool(*Greater)(const Date& left, const Date& right);


void Test2()
{
	Date d1(2020, 5, 6);
	Date d2(2020, 5, 7);
	Date d3(2020, 5, 8);

	priority_queue<Date, vector<Date>, Less> p(IsLess); // 大堆
	p.push(d1);
	p.push(d2);
	p.push(d3);
}

3.仿函数(函数对象)

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

	int Getday()
	{
		return _day;
	}
private:
	int _year;
	int _month;
	int _day;
};

// 第三种:仿函数----->函数对象
class Greater
{
public:
	// ():函数调用运算符
	bool operator()(Date& left, Date& right) // 这里不要写const,不然类型限定符不兼容
	{
		return left.Getday() > right.Getday();
	}
};

void Test3()
{
	Date d1(2020, 5, 6);
	Date d2(2020, 5, 7);
	Date d3(2020, 5, 8);

	priority_queue<Date, vector<Date>, Greater> p; // 小堆
	p.push(d1);
	p.push(d2);
	p.push(d3);
}

4.主函数

int main()
{
	// Testpriority_queue1();
	// Testpriority_queue();
	/*Test1();
	Test2();*/
	Test3();

	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序自定义类型可以通过重载比较操作符或者使用仿函数来实现。重载比较操作符是一种简单的方法,可以通过在自定义类型定义<操作符来指定排序规则。比如,如果要按照学生的成绩从高到低进行排序,可以在学生中重载<操作符,然后在sort函数中传入自定义类型比较函数。 另一种方法是使用仿函数,也就是重载函数调用操作符()的。这个可以接受两个自定义类型的参数,并根据自定义比较规则返回比较结果。比如,可以创建一个名为StudentComparator的仿函数来实现根据学生成绩排序的比较规则。然后在sort函数中传入这个仿函数的实例作为比较函数。 使用仿函数的好处是可以更灵活地定义排序规则,可以根据不同的排序需求创建不同的仿函数。同时,使用仿函数还可以方便地将排序规则封装起来,使代码更加清晰易读。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [sort对对象进行自定义排序/重载操作符/友元函数/仿函数](https://blog.csdn.net/qq_43791377/article/details/105552632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C++ sort排序之降序、升序使用总结](https://download.csdn.net/download/weixin_38640473/14839215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值