一直都搞不清楚使用优先队列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;
}