C++STL优先队列详解及练习

优先队列(priority queue)

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。---------------摘自百度百科

用法简介

优先队列priority_queue 定义在头文件中

pop() 删除队顶元素
empty() 如果队列为空返回真
top() 返回优先队列队顶元素
size() 返回优先队列中拥有的元素个数
push() 加入一个元素

优先队列和队列的差别在于优先队列不是按照入队顺序出队 ,而是按照队列中元素的优先权顺序出队

(默认为优先权大的先出 也可以通过指定算子来指定自己的优先顺序)
priority_queue 模板类有三个模板参数 第一个是元素类型 第二个是容器类型 第三个是比较算子  其中后两个都可以省略

默认容器是vector 默认算子是less 即小的往前排  大的往后排(出队时序列尾的元素出队)

定义

定义
priority_queueq1;
priority_queue >q2;//两个尖括号中间要留空格 否则会被误认为是>>右移运算符!
priority_queue,greater>q3;//定义小的先出队

关于定义算子:

如果是基本数据类型,或者已经定义了比较运算符的类,可以直接使用STL里面的less算子和greater是算子--默认为使用less算子(小的往前排 大的先出队)

如果要自定义自己的比较算子  方法有很多种

http://www.cnblogs.com/summerRQ/articles/2470130.html
//定义比较结构
struct cmp1{
    bool operator ()(int &a,int &b){
        return a>b;//最小值优先
    }
};

struct cmp2{
    bool operator ()(int &a,int &b){
        return a     }
};

//自定义数据结构
struct number1{
    int x;
    bool operator < (const number1 &a) const {
        return x>a.x;//最小值优先
    }
};
struct number2{
    int x;
    bool operator < (const number2 &a) const {
        return x     }
};

关于自定义算子的时候用重载运算符的方法:
优先队列试图将两个元素x和y代入比较运算符(对less算子,调用x,对greater算子,调用x>y),若结果为真,则x排在y前面,y将先于x出队,反之,则将y排在x前面,x将先出队。

练习题codeforces Round501Div3 C题  

这道题呢是个贪心 可以不用优先队列  也可以用  我们强行练习 一波优先队列

链接戳一戳传送门

#include
using namespace std;
const int N=1e5+7;
typedef long long ll;
priority_queueq;
int n,m,i,j,k;
ll sum;
int main(){
    scanf("%d%d",&n,&m);
	for(k=1;k<=n;++k){
        scanf("%d%d",&i,&j);
        sum+=i;
        q.push(i-j);//默认调用less算子  大的先出队
	}
	while(!q.empty()&&sum>m){
        sum-=q.top();
        q.pop();
	}
	if(sum<=m)printf("%d\n",n-q.size());
	else puts("-1");
}

练习题hdu1873

这道题呢是优先队列的好题

链接  hdu1873

代码

#include
#include
#include
#include
#include
#include
using namespace std;
int n,a,b;
string ss;
struct node{
    int x,y;
    bool friend operator <(node p,node q){
        if(p.x==q.x) return q.yp.x;// p的优先级小 就是小
    }
}s;
int main(){
    while(cin>>n){
        priority_queueque[5];
        int t=1;
        for(int i=0;i>ss;
            if(ss[0]=='I'){
                cin>>a>>b;
                s.x=b;
                s.y=t++;
                que[a].push(s);
            }
            else{
                cin>>b;
                if(!que[b].empty()) {
                    cout<

 

你可能感兴趣的:(STL)