STL优先队列priority_queue基本用法

来源:互联网 发布:云计算价值 编辑:程序博客网 时间:2024/06/05 05:50

我们在比赛的时候会经常用到堆这种数据结构,但是如果手打的话不仅耗费时间还容易出错,所以STL中的priority_queue模板在这时便可以发挥很大的用处,本人在这里写一下priority_queue的基本用法

基本成员函数

当然头文件是要用到队列的头文件#include< queue >的
q.top() 返回队列头部数据
q.push(x) 在队列尾部增加x数据
q.pop() 队列头部数据出队
q.empty() 判断队列是否为空
q.size() 返回队列中数据的个数
以及还有常用的两种构造方法(下面会详细解释)
1.priority_queue<变量类型>q;
2.priority_queue<变量类型,vector<变量类型>,比较函数>q;

上面的尖括号内第一个参数为入队元素类型(例如int),第二个为容器类型(例如vector< int >),第三个为比较函数(例如cmp)

第一种构造方法

首先priority_queue< int >对于元素中的优先级是按照大的优先级高来处理的,所以我们在打大根堆的时候不需要任何处理直接打就可以了(如果是要打小根堆的话下面会介绍第二种构造方法),具体的代码就只有一行
priority_queue< int >q;
如果要对某个结构体进行优先级的处理,我们便需要重载小于(<)这个运算符,这里展示的是结构体中有x和y两个元素,然后按照x大的优先来的,具体的代码如下

struct node{    bool operator < (const node &b) const{//在结构体中重载        return x<b.x;//!!!虽然注意这里写的是x<b.x,但是在优先队列中却是反过来的,以后讲的都是这样,可以理解成在队列中后面的越来越小    }    int x;    int y;};priority_queue< node >q;

第二种构造方法

前面并没有讲怎么使用int型变量的时候从小到达排序,这里使用第二种构造方法就可以了,因为第二种构造方法中有比较函数,所以我们要写一个比较函数,这个比较函数是要写在一个类中的,下面是从小到大的比较函数的写法

struct cmp{    bool operator () (const int &a,const int &b)const{        return a>b;    }};priority_queue< int,vector<int>,cmp >q;

但是每一次都这样写会太麻烦,于是这时我们还可以使用自带的一个比较函数

priority_queue< int,vector<int>,greater<int> /*注意这里前面一定要打一个空格,要不然会被以为是 ">>" 运算符 */>q;

相应的从大到小也有一个比较函数(虽然本来就是默认的)

priority_queue< int,vector<int>,less<int> >q;

虽然前面已经讲过怎么对于结构体申明优先级,但是对于第二种构造方法,也可以对结构体进行比较函数的定义,同样也是按照x从大到小的代码如下、

struct node{//是需要先定义结构体的    int x;    int y;};struct cmp{    bool operator () (const node &a,const node &b) const{        return a.x<b.x;//大致就是这个样子    }};priority_queue< node,vector<node>,cmp >q;

以上就是priority_queue的基本用法,如果是其他的优先级方式,可以按照上面给出的这种模型来打(其实除外还有很多种用法,只不过本蒟蒻不会)
希望我的一点总结可以给到大家帮助!!!

原创粉丝点击