优先队列,底层用 堆 来实现,队首元素一定是当前队列中优先级最高的那一个,可以在任何时候往优先队列中加入(push)元素,而优先队列底层的数据结构堆(heap)会随时调整结构,使得每次的队首元素都是优先级最大的
1. 定义
priority_queue<typename> name;
2. 访问
top() 函数 访问 队首元素(也可以称为堆顶元素),也就是优先级最高的元素
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
q.push(3);
q.push(4);
q.push(1);
printf("%d\n", q.top());
return 0;
}
3. 常用函数
(1)push(),q.push(x) 将 x 入队
(2)top(),获得队首元素
(3)pop(),令队首元素出队
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
q.push(3);
q.push(4);
q.push(1);
printf("%d\n", q.top());
q.pop();
printf("%d\n", q.top());
return 0;
}
(4)empty(),检测优先队列是否为空
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
if(q.empty() == true)
printf("Empty\n");
else
printf("Not Empty\n");
q.push(1);
if(q.empty() == true)
printf("Empty\n");
else
printf("Not Empty\n");
return 0;
}
(5)size(),返回优先队列内元素的个数
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
q.push(3);
q.push(4);
q.push(1);
printf("%d\n", q.size());
return 0;
}
4. priority_queue 内元素优先级的设置
(1)基本数据类型
数字大,优先级高,如果是 char 型,字典序大,优先级高
// 下面两种优先队列定义是等价的:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
// 下面 把最小的元素放在队首
priority_queue<int, vector<int>, greater<int> > q;
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
priority_queue<int, vector<int>, greater<int> > q;
q.push(3);
q.push(4);
q.push(1);
printf("%d\n", q.top());
return 0;
}
(2)结构体的优先级设置
重载:对已有的运算符进行重新定义,可以改变 小于号 的功能,重载为 大于号 的功能
struct fruit{
string name;
int price;
friend bool operator < (fruit f1, fruit f2){
return f1.price < f2.price;
}
}
重载 大于号 会编译错误,因为从数学上来说只需要重载小于号,即 f1 > f2 等价于判断 f2 < f1, 而 f1 == f2 则等价于判断