今日发现要使用堆,然后priority_queue 使用的恰好是堆,默认是大根堆,这样的话,如果遇到需要用到大根堆,小根堆来处理问题的时候,可以使用这个结构。
常用方法与队列差不 push(),pop(),top()
上一部分代码,可以看出默认比较是 less 所以是大根堆,默认的话,里面的容器是vector
代码语言:javascript复制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);
}
};