优先队列也是队列的一种,与一般队列的不同在于,队列中最大的元素总是位于队首的位置,每次元素的出队都是当前队列中最大的元素,底层的具体实现细节用到了堆(heap)。C++ STL中优先队列的泛化,底层默认采用vector向量容器,大概是考虑到队列容器的元素可以用做数组操作,就可以应用堆算法找出当前队列的最大元素,并将其调整到队首位置,确保最大元素优先出队。提供了获取队首的top函数,不提供获取队尾的函数。优先队列是一种应用相当广泛的的数据结构,元素入队后按照优先级出队,在操作系统和一些应用程序的任务调度处理都使用了优先队列来实现。
对于priority_queue优先队列容器,这里推荐一个很专业的C++网站,C++ Reference
http://www.cplusplus.com/reference/queue/priority_queue/priority_queue/
它给出了C++98和C++11两个版本,明显可以看出C++11对优先队列容器进行了不少扩展。
创建priority_queue对象
主要有两种方式。
(1) priority_queue()
priority_queue<int> pq;
(2) priority_queue(const priority_queue&)
拷贝构造函数。
priority_queue<int,list<int> > pq1;
priority_queue<int,list<int> > pq2(pq1);
元素入队
入队函数为push,它调用堆算法将入队元素移至堆中正确的位置,保证队列优先级最高的元素始终位于队首。优先队列没有预设队列大小,因此入队函数不会判断是否队满。
priority_queue<int> pq;
pq.push(1);
pq.push(2);
pq.push(3);
元素出队
出队函数为pop,将优先级最高的元素删除。该函数不会判断队列是否为空,需要自行判断。
priority_queue<int> pq;
while(!pq.empty())
{
pq.pop();
}
取队首元素
利用top函数读取队首元素,即优先级最高的元素。函数top必须在优先队列不为空的情形下执行才有意义。
priority_queue<int> pq;
while(!pq.empty())
{
cout<<pq.top()<<endl;
pq.pop();
}
利用empty函数判断队列是否为空。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int> pq;
pq.push(1);
pq.push(14);
pq.push(5);
pq.push(9);
pq.push(26);
while(!pq.empty())
{
cout<<pq.top()<<endl;//26,14,9,5,1
pq.pop();
}
return 0;
}
函数size返回优先队列当前元素的个数。
#include<iostream>
#include<queue>
#define QUEUE_SIZE 2
using namespace std;
int main()
{
priority_queue<int,deque<int> > pq;
if(pq.size()<QUEUE_SIZE)
{
pq.push(11);
}
if(pq.size()<QUEUE_SIZE)
{
pq.push(5);
}
if(pq.size()<QUEUE_SIZE)
{
pq.push(20);
}
while(!pq.empty())
{
cout<<pq.top()<<endl;//11,5
pq.pop();
}
return 0;
}