一、概述
priority_queue是一个拥有权值(优先级)观念的queue,除此之外和queue无异。priority_queue内的元素并非依照被推入的次序排序,而是按照元素的权值排列。权值最高者排列在最前面。缺省情况下priority_queue使用max-heap实现的,max-heap是一个以vector表现的完全二叉树。max-heap可以满足priority_queue所需的“按照权值高低自动递减排序”的特性。priority_queue同queue一样也被归为容器配接器。priority_queue不允许遍历操作,所以也不提供迭代器。使用priority_queue之前须先含入头文件<queue>。
二、priority_queue的核心接口
在<queue>中,class priority_queue定义如下:
namespace std{
template <class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue;
}
template第一个参数是元素型别;第二个参数定义了内部来存放元素的容器,缺省则是vector;第三个参数定义出排序准则,缺省情况下使用operator<作为比较标准。
- 初始化方式与底层实现容器的初始化方式相同。
- size()返回queue的数据元素个数。
- empty()判断queue是否为空,空返回true。
- push()会将一个元素推入queue中。
- top()会返回priority_queue的下一个元素。
- pop()会删除priority_queue一个元素。
三、程序示例
priority_queue的使用示例
//example of priority_queue,use default container max-heap
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<float> q;
q.push(66.6);
q.push(22.2);
q.push(44.4);
cout << q.top() << ' ';
q.pop();
cout << q.top() << '\n';
q.pop();
q.push(11.1);
q.push(55.5);
q.push(33.3);
q.pop();
while (!q.empty()){
cout << q.top() << ' ';
q.pop();
}
cout << endl;
return 0;
}
输出结果:
以vector作为priority_queue的底层容器实例:
//use list to construct queue
#include<queue>
#include<iostream>
#include<functional>
using namespace std;
int main()
{
//参照上面priority_queue的类型介绍,排序准则为递增排序
priority_queue<float, std::vector<float>, greater<float>> q;
//priority_queue<float> q;
q.push(66.6);
q.push(22.2);
q.push(44.4);
cout << q.top() << ' ';
q.pop();
cout << q.top() << '\n';
q.pop();
q.push(11.1);
q.push(55.5);
q.push(33.3);
q.pop();
while (!q.empty()){
cout << q.top() << ' ';
q.pop();
}
cout << endl;
return 0;
}
输出结果: