标签:
今日发现要使用堆,然后priority_queue 使用的恰好是堆,默认是大根堆,这样的话,如果遇到需要用到大根堆,小根堆来处理问题的时候,可以使用这个结构。
常用方法与队列差不 push(),pop(),top()
上一部分代码,可以看出默认比较是 less 所以是大根堆,默认的话,里面的容器是vector
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 priority_queue<_Ty, _Container, _Pr> _Myt; typedef _Container container_type; typedef typename _Container::value_type value_type; protected: _Container c; // the underlying container _Pr comp; // the comparator functor 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); } void push(value_type&& _Val) { // insert element at beginning c.push_back(_STD move(_Val)); push_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()); } void push(const value_type& _Val) { // insert value in priority order c.push_back(_Val); push_heap(c.begin(), c.end(), comp); } void pop() { // erase highest-priority element pop_heap(c.begin(), c.end(), comp); c.pop_back(); } void swap(_Myt& _Right) { // exchange contents with _Right _Swap_adl(c, _Right.c); _Swap_adl(comp, _Right.comp); } };
标签:
原文地址:http://www.cnblogs.com/cycxtz/p/4742832.html