priority_queue的源代码以及实例

priorityu_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视新元素等功能
由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径
priority 带有其内的元素并非是依照被推入的顺序排列,而是自动依照元素的权值排列,权值最高者排在前面
缺省情况下priority_queue利用max-heap完成,可以满足priority_queue所需要的“依照权值高低自动递减排序”的特性

template ,class Compare=less >
public:
	typedef typename Sequence::value_type value_type;
	typedef typename Sequence::size_type size_type;
	typedef typename Sequence::reference reference;
	typedef typename Sequence::const_ference 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 都是泛型算法
	template 
	priority_queue(InputerIterator first,InputerIterator last,const Compare &x)
	:c(first,last),comp(x){make_heap(c.begin(),c.end(),comp);}
	template
	priority_queue(InputerIterator first,InputerIterator last)
	:c(first,last){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());

}
};

下面是一个测试实例
//priority_queue的新元素,进出都有一定的规则,只有queue顶端的元素(权值最高者)才有机会被外界取出
//priority_queue不提供遍历功能,也不提供迭代器

#include
#include
#include
using namespace std;
int main(){
	int ia[9]={0,1,2,3,4,8,9,3,5};
	priority_queueipq(ia,ia+9);
	cout<<"size="<

你可能感兴趣的:(stl)