priority_queue
默认大根堆
priority_queue<int> Q;
Q.push(3);Q.push(4);Q.push(2);
while(!Q.empty()) {
cout << Q.top() << ' ';
Q.pop();
}
//输出为4 3 2
转小根堆(参数1:变量类型,参数2:内存分配器,参数3:元素比较器)
#include <functional>
priority_queue<int, vector<int>, greater<int>> Q;
//输出为2 3 4
关于(结构体)优先队列 =>(重载运算符),且其中一定无等号,即严格偏序,否则可能会出现问题
想用结构体类型实现多关键字比较,重在运算符指定两个结构体之间比较
重载运算符(operator<)相当于重新定义函数,函数为小于号的返回函数
STL中只认小于号,重载大于号无用
大根堆重载
(bool operator<)此时为结构体左边元素, 小于号右边仍需元素,&o即当前小于号右边的数
对于逻辑a < b,其中b即&o,参数a则在其中调用
struct Node {
int x, y;
//想定义有Node1 < Node2
//Node1.x < Node2.x || (Node1.x == Node2.x && Node1.y < Node2.y)多关键字排序
// bool operator< //此时为结构体左边元素
//a < b逻辑即a.x != b.x : a.x < b.x, 否则比较y
bool operator<(const Node &o) const{
if(x != o.x) {//x即a,o.x即b
return x < o.x;
}
return y < o.y;
}
//Node构造函数:意义为返回Node类型结构体,且有2参数X,Y,将X,Y赋值给结构体中x,y
Node(int X, int Y) : x(X), y(Y) {}
};
比较策略任意,也可能为return x + y < o.x + o.y;
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Node {
int x, y;
//想定义有Node1 < Node2
//Node1.x < Node2.x || (Node1.x == Node2.x && Node1.y < Node2.y)多关键字排序
// bool operator< //此时为结构体左边元素
//a < b逻辑即a.x != b.x : a.x < b.x, 否则比较y
bool operator<(const Node &o) const{
if(x != o.x) {//x即a,o.x即b
return x < o.x;
}
return y < o.y;
}
//Node构造函数:意义为返回Node类型结构体,且有2参数X,Y,将X,Y赋值给结构体中x,y
Node(int X, int Y) : x(X), y(Y) {}
};
int main() {
priority_queue<Node> Q;
Q.push({1, 2}); Q.push({1, 3}); Q.push({2, 3});
while(!Q.empty()) {
cout << Q.top().x << ' ' << Q.top().y << '\n';
Q.pop();
}
return 0;
}
//输出
2 3
1 3
1 2
小根堆重载
将x和o.x以及y和o.y之间的比较从<变为>即可,因priority_queue用小于号判定大于: 其中逻辑是当,当!a<b(则为a>b)
当将小于号定义改为a>b,(则重载小于号逻辑不成立时原!a<b则为实际上的!a>=b),即a<b
即通过逻辑实现大于(逻辑每次取!(取反即可))
即正常使用大根堆正常定义符号,使用小根堆则反过来定义小于符号
浙公网安备 33010602011771号