简介:
优先级队列是一种常见的数据结构,在《STL源码剖析》中给出的定义是:priorty_queue是以个带权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。
由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素。
但是优先级队列中的元素并非依照被推入队列的顺序排列。而是自动依照元素的权值排列。权值最高者排在最前面。
缺省的情况下维护的是一个大堆,即权值以从高到低排列。
因为优先级队列的内部是用堆来维护,所以很多时候我们要使用堆的情况下会选择用优先级队列来代替
优先级队列的基本操作(其实就和一般的队列是一样的):
-
q.size();
//返回q里元素个数
-
q.empty();
//返回q是否为空,空则返回1,否则返回0
-
q.push(k);
//在q的末尾插入k
-
q.pop();
//删掉q的第一个元素
-
q.top();
//返回q的第一个元素
常见用法:
1.优先级判断默认使用<操作符,输出按权值从高到低顺序
-
int main()
-
{
-
priority_queue<
int> p1;
//往队列里直接存入整型
-
p1.push(
5);
-
p1.push(
4);
-
p1.push(
6);
-
p1.push(
3);
-
p1.push(
1);
-
for (
int i =
0; !p1.empty(); ++i)
-
{
-
cout << p1.top() <<
" ";
-
p1.pop();
-
}
-
return
0;
-
}
-
输出:
6 5 4 3 1
2.权值从低到高的顺序输出(greater优先队列)
priority_queue<int, vector<int>, greater<int> > q
第一个参数为元素的类型,第二个参数为容器类型,第三个参数为比较函数(默认为less),上面的为从小到大的优先级队列,如果将greater改为less或者删去第三个参数,即为权值从大到小排列。如图。注意greater包含在头文件functional内。
对应的还有less 优先队列
priority_queue<int,vector<int>,less<int> >q;
这其实就和一开始的优先队列一样了,也是从权值大的开始输出
3.对结构体进行操作
有时候我们想要往队列里存储结构体,那么为了实现和内置类型一样的优先级比较,我们就必须在结构体中实现对“<”的重载。因为优先级队列在内部实现调整的时候会去找“<”操作符,如果找不到就会报错。如下所示。
-
#include<queue>
-
using
namespace
std;
-
struct node{
-
char s[
15];
-
int rank;
-
friend
bool
operator < (node a,node b ){
-
return a.rank>b.rank;
-
}
-
};
-
priority_queue<node>q;