1.概念:
优先级队列允许用户以任何次序将任何元素堆入容器内,但取出时一定是从优先权最高的(也就是数值最高)的元素开始取,binary max heap正是具有这样的性质,适合作为优先级队列的底层结构。
所谓binary heap就是一种完全二叉树,正操二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。
那么堆算法在STL中的是:push_heap算法,pop_heap算法、sort_heap算法、make_heap算法(建堆).
make_heap算法用来将一段现有的数据转换为一个heap.
优先级队列是一个拥有权限观念的队列,它允许加入新元素、移除旧元素、审视元素值等功能,由于这是一个queue,所以它只允许在底端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径。其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列,权值最高者,排在最前面。
缺省情况下优先级队列利用一个max_heap完成,后者是一个以vector表现得完全二叉树,大堆可以满足优先级队列所需要的”依权值高低自动递减排序”的特性。
2.优先级队列定义完整列表
由于优先级队列完全以底部容器为依据,再加上heap处理规则,缺省情况下是以vector为底部容器。将其称为容器配接器(container adapter).
优先级队列中没有迭代器。
3.优先级队列的使用
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
int a[] = { 0, 1, 2, 3, 4, 8, 9, 3, 5 };
priority_queue<int>q(a, a + 9);//
cout << "size=" << q.size() << endl;
for (int i = 0; i < q.size(); i++)
{
cout << q.top() << " ";//求出堆顶元素
}
cout << endl;
while (!q.empty())
{
cout << q.top() << " ";
q.pop();
}
cout << endl;
system("pause");
return 0;
}
4.优先级队列的实现(底层是堆结构)
#include"heap.h"
template<class T>
class Priority_queue
{
public:
Priority_queue()
{}
void push(const T&data)
{
hp.push(data);
}
void pop()
{
hp.pop();
}
size_t size()
{
return hp.size();
}
Heap<T,Compa>hp;
};
int main()
{
Priority_queue<int>p;
p.push(1);
p.push(2);
cout << p.size() << endl;
p.pop();
cout << p.size() << endl;
system("pause");
return 0;
}