priority_queue自定义比较函数的使用

一直都搞不清楚使用优先队列priority_queue对结构体进行排序时,重载小于号的使用方法,今天终于弄明白了

首先,必须要知道使用priority_queue时默认重载<符号。

struct Node
	{
		int val;
		ListNode* ptr;
		Node(int x, ListNode* p) :val(x), ptr(p) {}
		bool operator<(const ListNode&left)const
		{
			return val < left.val;
		}
	};
	priority_queue<Node,vector<int>,less<>>dealer;

对于以上这种重载小于号的函数写法。函数的意义就是就是比较两者之间哪一个结构体的优先级更小。
如果是这样就说明对于这个结构体来说,数据越小优先级越小。这说明这是一个大顶堆。

bool operator<(const ListNode&left)const
{
	return val < left.val;
}

如果函数是这样写的就说明对于这个结构体来说,数据越大优先级越小

bool operator<(const ListNode&left)const
{
	return val > left.val;
}

这说明这是一个小顶堆。
总之,重载小于函数实际上是定义了判断当前的结构体优先级小于其他结构体元素的方法
但是当我们使用这一种定义方法的时候,重载符号的含义就会发生变化

     priority_queue<Node,vector<int>,greater<>>dealer;

如果尖括号中的最后一项写的是greater<>,那么这里的含义就是如果小于关系成立,当前结构体的优先级大于其他结构体的优先级。

附上CCF的一道题来解释用法

#include<iostream>
#include<queue>
#include<vector>
#define MAX 2010


using namespace std;
typedef long long LL;
struct area
{

	int L, R;
	bool operator < (const area& in)const
	{
		if (L != in.L)
			return L > in.L;
		else
		{
			return R > in.R;
		}
	}
} Area1[MAX], Area2[MAX];



priority_queue<area>que;
int main()
{
	freopen("sb.txt", "r", stdin);
	ios::sync_with_stdio(false);
	int count;
	cin >> count;
	for (int i = 0; i < 2 * count; i++)
	{
		int l, r;
		cin >> l >> r;
		que.push({ l,r });
	}
	long long ans = 0;
	int left = 0x3f3f3f3f;
	int right = 0x3f3f3f3f;
	while (!que.empty())
	{
		area t = que.top();
		que.pop();

		if (t.L >= left && t.L < right)
		{
			if (t.R < right)
			{
				
				ans +=(long) (t.R - t.L);

				continue;
			}
		
			ans += (long)(right - t.L);
		}
		left = t.L;
		right = t.R;
	}
	cout << ans << endl;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值