写了一个结构体,想用优先队列,但是懒得自己写堆
原版的优先队列怎么自适应结构体结构呢?
我们知道,对于sort快排,我们可以通过传递一个比较函数指针,实现自定义的比较
实际上,对于sort快排,除了传递函数指针的方式来说,我们还可以写一个重载的比较运算符!
而对于优先队列,我们没有传递函数指针的方法,所以我们只好选择重载比较运算符
注意点:
1,一般只需要重载小于运算符就可以了,但是如果你不放心的话都可以重载
2,重载运算符之后不能用priority_deque的第三个参数(greater<>和less<>),会报错,不写按大数默认优先,但是可以在operator里面调整实现自定义
完整示例:
#include <iostream>
#include <algorithm>
#include <queue>
#include <deque>
using namespace std;
char a[30];
struct zimu{
char ch;
int num;
};
bool operator <(const zimu& a,const zimu& b){
return a.num>b.num;
}
priority_queue<zimu,deque<zimu> > que;
zimu make_zimu(char ch){
zimu a;
a.ch=ch;
a.num=(ch-'a');
return a;
}
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
for(int i=0;i<n;i++){
que.push(make_zimu(a[i]));
cout << que.top().ch << " " << que.top().num << endl;
}
return 0;
}
当然了,如果你不想写重载,你可以用pair和tuple,会默认以第一个为排序依据,而且也可以用greater<>和less<>
Over~