优先队列的详解

来源:互联网 发布:linux 用户环境变量 编辑:程序博客网 时间:2024/06/05 06:52

在介绍优先队列实现之前,我们先简单了解一下概念:


一.数据越小,优先级越高

priority_queue<int, vector<int>, greater<int> >pq;
priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:

priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.

STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,

优先队列就是大顶堆,队头元素最大。

二.优先队列- 声明方式

1.普通方法:

priority_queue<int>q;  //通过操作,按照元素从大到小的顺序出队priority_queue<int,vextor<int>, greater<int> >q;  //通过操作,按照元素从小到大的顺序出队

2.自定义优先级:


struct cmp {operator bool ()(int x, int y) {return x > y; // 数值小的优先级高,也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高}//此处的大括号不能少,少了会报错};priority_queue<int, vector<int>, cmp>q;    //定义方法,其中,第二个参数为容器类型,第三个参数为比较函数。

3.结构体声明方式:

struct node {int x, y;friend bool operator < (node a, node b) {return a.x > b.x;    //结构体中,x小的优先级高}};priority_queue<node>q;  //定义方法

struct node{      int a,b;};    bool operator < (const book &x,const book &y)  {      return x.a > y.b;  }  

然后给大家分享两个模板式的题:

结构体定义的优先队列,在这题中,我将两个结构体的优先队列都有介绍和运用:点击打开链接

一般的优先队列:点击打开链接

原创粉丝点击