概述
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 _Container public: 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, comparator make_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 comparator make_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 comparator make_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 comparator c.insert(c.end(), _First, _Last); make_heap(c.begin(), c.end(), comp); } bool empty() const { // test if queue is empty return (c.empty()); } size_type size() const { // return length of queue return (c.size()); } const_reference top() const { // return highest-priority element return (c.front()); } reference top() { // return mutable highest-priority element (retained) return (c.front()); } void push(const value_type& _Pred) { // insert value in priority order c.push_back(_Pred); push_heap(c.begin(), c.end(), comp); } void pop() { // erase highest-priority element pop_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; }
运行结果: