1. 定义
优先队列是一个容器,根据一定方式为项分配优先级,其中只有优先级最高的项才能被访问和删除。
优先队列是公平的,如果在优先队列有两项的优先级别相同,那么在队列中滞留时间长的项将从队列中删除。
2. 声明
#include <queue>
priority_queue<class T, class Container = vector<T>, class Compare = less<Container::value_type> > //注意此处为“> >”,有至少有一个空格,否则编译器会报错
第一个参数T是优先队列中存储的项的类型。
第二个模板参数Container代表的是基础容器类。相应模板变元类的要求是要包含方法front、push_back和pop_back,并且支持随机访问迭代器。vector或deque类满足了这些要求,缺省类是vector类。(不能采用list类)
第三个参数Compare对应的模板变元必须是一个函数类,它的operator()对value_type进行比较。缺省变元是内置函数类less,因此值最大的项将放在priority_queue对象的前面。
缺省情况下优先级别最高的项就是值最大的项。
3. 重要函数
(1)void push(const value_type& x);
后置条件:x被插入到这个优先队列中。averageTime(n)是常数,而worstTime(n)是O(n)。
(2)void pop();
前置条件:这个优先队列非空。
后置条件:发送这个消息之前队列中优先级别最高的项被删除。worstTime(n)是O(logn)。
(3)const value_type& top() const;
前置条件:这个优先队列非空。
后置条件:返回对这个队列中优先级别最高的项的常量引用。
注意: 因为const是返回类型规格说明的一部分,所以修改priority_queue对象的顶部项是非法的。
4. 用法
(1)以hihoCoder第二十八周为例-题目1 : 题外话·堆
#include <iostream>
#include <queue>
using namespace std;
//priority_queue<int, vector<int>, greater<int> > Q;
priority_queue<int, vector<int>, less<int> > Q; //最大堆
int main() {
int n, num;
char op;
cin>>n;
for(int i=0; i<n; i++) {
cin>>op;
if(op == 'A') {
cin>>num;
Q.push(num);
} else if(op == 'T') {
cout<<Q.top()<<endl;
Q.pop();
}
}
return 0;
}
(2)自定义类型
对于自定义的类型必须自己重载 “operator<”或自定义比较函数。
#include <iostream>
#include <queue>
using namespace std;
struct Node{
int x, y;
}node;
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>q;
for(int i=0;i<10;i++){
node.x=i;
node.y=10-i/2;
q.push(node);
}
while(!q.empty()){
cout<<q.top().x <<' '<<q.top().y<<endl;
q.pop();
}
return 0;
}
自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。此时不能像基本类型这样声明priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义.
#include <iostream>
#include <queue>
using namespace std;
struct Node{
int x, y;
}node;
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>q;
for(int i=0;i<10;i++){
node.x=i;
node.y=10-i/2;
q.push(node);
}
while(!q.empty()){
cout<<q.top().x<<' '<<q.top().y<<endl;
q.pop();
}
return 0;
}
参考代码:点击打开链接(致谢!)