priority_queue是一个拥有权值观念的queue,由于是一个queue,所以只允许在底部加入元素(push),并在顶部取出最大元素(pop),除此之外无其他存取元素的途径。
缺省情况下priority_queue是利用max-heap完成,后者是一个以vector表现的完全二叉树。
priority_queue也是一种container adapter,同时没有迭代器。
template<class T,class Sequence=vector<T>,
class Compare=less<typename Sequence::value_type>>
class priority_queue {
public:
typedef typename Sequence::value_type 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:
priority_queue():c(){}
explicit priority_queue(const Compare& x):c(),comp(x){}
//以下使用的make_heap(),push_heap(),pop_heap()都是泛型算法
//注意,任一个构造函数都立刻于底层容器内产生一个隐式表述heap
template<class InputIterator>
priority_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{
//push_heap是泛型算法,先利用底层容器的push_back()将新元素推入末端
//再重排heap
c.push_back(x);
push_heap(c.begin(), c.end(), comp);//push_heap是泛型算法
}
__STL_UNWIND(c.clear());
}
void pop() {
__STL_TRY{
//pop_heap是泛型算法,从heap内取出一个元素,它并不是真正将元素弹出
//而是重排heap,再以底层容器的pop_back()取得被弹出的元素
pop_heap(c.begin(),c.end(),comp);
c.pop_back();
}
__STL_UNWIND(c.clear());
}
};