Priority Queues优先级队列详解
来源:互联网 发布:复旦网络教育 编辑:程序博客网 时间:2024/05/01 03:49
概述
STL中 class priority_queue<>实作出一个queue,其中的元素根据优先级被读取,top() / pop()移除/存取下一个元素。这里的“下一个元素”是指“优先级最高”的元素。即priority_queue内的元素已经根据其值进行了排序。
在priority_queue和queue都定义于头文件<queue>
namespace std{template <class T, class Container = vector<T> , Class Compare = less<tyname Container::value_type> >Class priority_queue;}
第一个template参数是元素类型,第二个template参数定义了内部元素实际存放的容器,默认是vector,但必须要支持存取随机迭代器。第三个template参数是“用以搜寻下一个最高优先级元素”的排序准则。默认是以operator<作为比较标准,图1展示了priority_queue的接口。
核心接口
priority_queue的核心接口主要由成员函数push(),top(),pop()组成:
push()
- 将一个元素置入priority_queue内.
- 移除priority_queue中“优先级最高”的元素,如果存在多个相等的元素,则无法确知会移除哪一个.
- 调用者保证priority_queue非空.
- 该函数无返回值,想处理被移除的元素,需要调用top().
- 从priority_queue中返回“优先级最高的元素”,如果存在多个相等的元素,则无法确知会返回哪一个.
- 调用者必须保证priority_queue非空,否则会导致未定义行为.
源码实现
template<class _Ty,class _Container = vector<_Ty>,class _Pr = less<typename _Container::value_type> >class priority_queue{// priority queue implemented with a _Containerpublic:typedef _Container container_type;typedef typename _Container::value_type value_type;typedef typename _Container::size_type size_type;typedef typename _Container::reference reference;typedef typename _Container::const_reference const_reference;priority_queue(): c(), comp(){// construct with empty container, default comparator}explicit priority_queue(const _Pr& _Pred): c(), comp(_Pred){// construct with empty container, specified comparator}priority_queue(const _Pr& _Pred, const _Container& _Cont): c(_Cont), comp(_Pred){// construct by copying specified container, comparatormake_heap(c.begin(), c.end(), comp);}template<class _Iter>priority_queue(_Iter _First, _Iter _Last): c(_First, _Last), comp(){// construct by copying [_First, _Last), default comparatormake_heap(c.begin(), c.end(), comp);}template<class _Iter>priority_queue(_Iter _First, _Iter _Last, const _Pr& _Pred): c(_First, _Last), comp(_Pred){// construct by copying [_First, _Last), specified comparatormake_heap(c.begin(), c.end(), comp);}template<class _Iter>priority_queue(_Iter _First, _Iter _Last, const _Pr& _Pred,const _Container& _Cont): c(_Cont), comp(_Pred){// construct by copying [_First, _Last), container, and comparatorc.insert(c.end(), _First, _Last);make_heap(c.begin(), c.end(), comp);}bool empty() const{// test if queue is emptyreturn (c.empty());}size_type size() const{// return length of queuereturn (c.size());}const_reference top() const{// return highest-priority elementreturn (c.front());}reference top(){// return mutable highest-priority element (retained)return (c.front());}void push(const value_type& _Pred){// insert value in priority orderc.push_back(_Pred);push_heap(c.begin(), c.end(), comp);}void pop(){// erase highest-priority elementpop_heap(c.begin(), c.end(), comp);c.pop_back();}protected:_Container c;// the underlying container_Pr comp;// the comparator functor};
应用实例
/*****************************************************************函数名称:PriorityQueuesTest*功 能:优先级队列使用说明*作 者:Jin*日 期:2016年7月6日****************************************************************/void PriorityQueuesTest(){ priority_queue<int> PriorityQue; //insert elements into priority queue PriorityQue.push(66); PriorityQue.push(22); PriorityQue.push(44); cout <<"insert num to priority queue : 66 22 44" << endl; //read and print two elements cout <<"read first element and pop it: " << PriorityQue.top() << endl; PriorityQue.pop(); cout << "read second element and pop it: " << PriorityQue.top() << endl; PriorityQue.pop(); //insert three more elements PriorityQue.push(11); PriorityQue.push(55); PriorityQue.push(33); cout <<"insert num to priority queue : 11 55 33" << endl; //pop one elements without dealing data cout << "pop one elements" << endl; PriorityQue.pop(); //pop and print remaining element cout << "pop and print remaining element:" << endl; while (!PriorityQue.empty()) { cout << PriorityQue.top() << ' '; PriorityQue.pop(); } cout << endl;}
运行结果:
1 0
- Priority Queues优先级队列详解
- C++ Queues(队列)、Priority Queues(优先队列)
- C++ Queues(队列)、Priority Queues(优先队列)
- 优先级队列 priority queue
- Priority Queue 优先级队列
- 优先级队列(Priority Queue)
- STL之heap与优先级队列Priority Queue详解
- C++ Priority Queues(优先队列) and C++ Queues(队列)
- priority queues
- Priority Queues
- 堆排序的应用 Priority queues 优先级排序
- 优先级队列(priority——queue)
- [STL]Priority Queue (eden)优先级队列
- 标准模板库STL中优先队列Priority Queues使用手册
- 【STL学习】优先级队列Priority Queue详解与C++编程实现
- heap with priority queues
- C++ STL Priority Queues
- Heap and Priority Queues
- UWP MD5加密
- Linux基础知识的学习(六)
- UVA1619 感觉不错
- 5-26 单词长度 (15分)
- 对于大型二维数组的定义 位置不同 导致会不会强制结束。。。 这是为何?
- Priority Queues优先级队列详解
- Integer to Roman
- 开始node之旅
- Android多线程断点续传
- 相机抖动
- Hdu 5338 ZZX and Permutations(线段树+贪心)
- RecyclerView
- typedef 和define 的区别
- Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)