STL之容器适配器priority_queue
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL之容器适配器priority_queue相关的知识,希望对你有一定的参考价值。
priority_queue(优先队列)是一个拥有权值观念的queue,它允许加入新元素,删除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素, 除此之外别无其它存取元素的途径。
缺省情况下priority_queue系列利用一个max_heap(最大堆)完成,后者是一个以vector表现的完全二叉树。Max_heap可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。
priority_queue完全以底部容器为根据,再加上heap处理规则,所以其实现非常简单,这里给出其模板声明:
template <class T, class Sequence = vector<T>, class Compare = less<typename Sequence::value_type>> class priority_queue { //… protected: Sequence c; // 底层容器 Compare comp; // 元素大小比较标准 //… };
priority_queue模板有3个参数,第一个为元素类型,第二个为指定底层容器,默认为vector,第三个为内部元素比较函数,默认为标准库内置关系运算类仿函数less, 顺便把less的模板找出来看看:
template<class T> struct less : public binary_function<T, T, bool> { bool operator() (const T& x, const T& y) { return x < y;} };
类似内置关系运算仿函数一共6个,为别为:
等于 equal_to<T> 不等于 not_equal_to<T> 大于 greater<T> 大于或等于 greater_equal<T> 小于 less<T> 小于或等于 less_equal<T>
之后会单独将仿函数详细介绍下,这里只做相关了解。
下面给出测试代码:
#include <queue> #include <iostream> #include <algorithm> using namespace std; int main() { int ia[9] = {0,1,2,3,4,8,9,3,5}; priority_queue<int> ipq(ia, ia+9); cout << "size = " << ipq.size() << endl; // size = 9 for (int i = 0; i < ipq.size(); i++) { cout << ipq.top() << ‘ ‘; // 9 9 9 9 9 9 9 9 9 } cout << endl; while (!ipq.empty()) { cout << ipq.top() << ‘ ‘; // 9 8 5 4 3 3 2 1 0 ipq.pop(); } cout << endl; return 0; }
以上是关于STL之容器适配器priority_queue的主要内容,如果未能解决你的问题,请参考以下文章
[ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
[C/C++]详解STL容器3--stackqueue和priority_queue的功能和模拟实现,deque和容器适配器的介绍