(priority_queue)优先队列之hihiCoder 第28周

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;
}

参考代码:点击打开链接(致谢!)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值