priority_queue概述
priority_queue是一个拥有权值观念的queue,它允许加入新元素、移除旧元素、审视元素值等功能。由于这是一个queue,所以只允许在低端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径。
priority_queue内的元素并非按照被推入的次序排列,而是自动依照元素的权值排列,权值最高的排在最前面。
缺省情况下,priorit-queue是利用一个max-heap完成,后者是一个以vector表现的完全二叉树。
priority_queue定义完整列表
注意:priority-queue没有迭代器
由于priority_queue完全以底部容器为根据,再加上heap处理规则,所以实现非常简单,默认以vector为底部容器,因为其是以queue为底部容器来完成其功能,这种具有“修改某物接口”形成另一种风貌性质者,我们称之为adapter。
template<typename T>
struct less{
bool operator() (const T& a,const T& b) const{
return a<b;
}
};
template<typename T>
struct more{
bool operator() (const T& a,const T& b) const{
return a>b;
}
};
template<typename T,typename Sequence = TinySTL::vector<T>,
typename Compare = TinySTL::more<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;
private:
Sequence c;//底层标准
Compare comp;//元素大小比较标准
public:
priority_queue():c(){}
explicit priority_queue(const Compare& x):c(),comp(x){}
template<typename InputIterator>
priority_queue(InputIterator first,InputIterator last):
c(first,last){TinySTL::make_heap(c.begin(),c.end(),comp);}
template<typename InputIterator>
priority_queue(InputIterator first,InputIterator last,const Compare& x):
c(first,last),comp(x){TinySTL::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){
c.push_back(x);
TinySTL::push_heap(c.begin(),c.end(),comp);
}
void pop(){
TinySTL::pop_heap(c.begin(),c.end(),comp);
c.pop_back();
}
};