1. 优先级队列
优先队列是一种容器适配器。
- 默认使用vector作为其底层存储数据的容器;
- 在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
- 注意:默认情况下priority_queue是大堆
2. 所在头文件
#include<queue>
3. 常用接口
priority_queue()/priority_queue(first,last) //构造一个空的优先级队列
empty( ) //检测优先级队列是否为空,是返回true,否则,false
top( ) //返回优先级队列中最大(最小元素),即堆顶元素
push(x) //在优先级队列中插入元素x
pop() //删除优先级队列中最大(最小)元素,即堆顶元素
4. 使用示例
- 定义大根堆
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> p;
p.push(1);
p.push(2);
p.push(8);
p.push(5);
p.push(43);
for(int i=0;i<5;i++){
cout<<p.top()<<endl;
p.pop();
}
return 0;
}
- 定义小根堆:priority_queue<int,vector,greater > p
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> > p;
p.push(1);
p.push(2);
p.push(8);
p.push(5);
p.push(43);
for(int i=0;i<5;i++){
cout<<p.top()<<endl;
p.pop();
}
return 0;
}
- 自定义优先级,重载默认的 < 符号
#include<iostream>
#include<queue>
#include<cstdlib>
using namespace std;
struct Node{
int x,y;
Node(int a=0, int b=0):
x(a), y(b) {}
};
struct cmp{
bool operator()(Node a, Node b){
if(a.x == b.x) return a.y>b.y;
return a.x>b.x;
}
};
int main(){
priority_queue<Node, vector<Node>, cmp>p;
for(int i=0; i<10; ++i)
p.push(Node(rand(), rand()));
while(!p.empty()){
cout<<p.top().x<<' '<<p.top().y<<endl;
p.pop();
}
return 0;
}
参考链接:priority_queue