STL之优先级队列priority_queue
2016-07-02 21:14
549 查看
priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值。
由于是个queue,所以只允许低端加入元素,并从顶端取出元素。
缺省情况下priority_queue利用一个max-heap完成,后者是一个以vector表现的完全二叉树。
最大堆可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。
priority_queue定义:
因为所有priority_queue元素进出有一定规则,只有顶端元素才有机会被外界取用,priority_queue不提供遍历功能,也不提供迭代器。
程序演示:
由于是个queue,所以只允许低端加入元素,并从顶端取出元素。
缺省情况下priority_queue利用一个max-heap完成,后者是一个以vector表现的完全二叉树。
最大堆可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。
priority_queue定义:
template <class T, class Sequence = vector<T>, class Compare = less<typename Sequence::value_type> > class priorrty_queue { public: typedef typename Sequence::value_type; typedef typename Sequence::size_type size_type; typedef typename Sequence::reference reference; typedef typename Sequence::const_reference const_reference; protected: Sequence c; //底层容器 顺序表 Compare comp; //元素大小比较标准 public: priorrty_queue() : c(){} explicit priorrty_queue(const Compare& x) : c(), comp(x) {} template <class InputIterator> priorrty_queue(InputIterator first, InputIterator last, const Compare& x) : c(first, last), comp(x) { make_heap(c.begin(), c.end(), comp); } bool empty() const { return c.empty(); } size_type size() const { return c.size() } const_reference top() const{ return c.front(); } void push(const value_type& x) { _STL_TRY{ c.push_back(x); push_heap(c.begin(), c.end(), comp); } _STL_UNWIND(c.clear()); } void pop() { _STL_TRY { pop_heap(c.begin(), c.end(), comp); c.pop_back(); } _STL_UNWIND(c.clear()); } };
因为所有priority_queue元素进出有一定规则,只有顶端元素才有机会被外界取用,priority_queue不提供遍历功能,也不提供迭代器。
程序演示:
#include <queue> #include <algorithm> #include <iostream> 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; for (int i = 0; i < ipq.size(); ++i){ cout << ipq.top() << ' '; } cout << endl; while (!ipq.empty()) { cout << ipq.top() << " "; ipq.pop(); } cout << endl; system("pause"); } /* size = 9 9 9 9 9 9 9 9 9 9 9 8 5 4 3 3 2 1 0 请按任意键继续. . . */
相关文章推荐
- WindowsBuilder控件中文编码问题
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- iOS开发~一个UIButton的小问题一定要小心
- iOS GPUImage之自定义滤镜
- uuid生成器
- java基础/StringbBuffer/StringBuilder
- A. 【UER #6】票数统计
- #210. 【UER #6】寻找罪犯
- 基础控件篇(1)-UItableView
- IOPS=(Queue Depth)/(IO latency)
- UITextField属性一
- cpp quiz
- iOS开发- 利用runtime拦截UIButton的点击事件,防止重复点击
- iOS GPUImage之头文件说明
- iOS8统一的系统提示控件——UIAlertController
- iOS GPUImage之实时拍摄添加Faceu效果(6)
- Android进阶(二十六)MenuInflater实现菜单添加
- Android进阶(二十六)MenuInflater实现菜单添加
- Android进阶(二十四)Android UI---界面开发推荐颜色
- Android进阶(二十四)Android UI---界面开发推荐颜色