heap && priority_queue
heap (堆)
建立在完全二叉树上,分为两类:大根堆
、小跟堆
, 其在STL中做priority_queue
的助手,即以任何顺序将元素推入容器中,然后取出一定是从优先权最高的元素开始取,完全二叉树具有这样的性质,适合做priority_queue的底层。
priority_queue(优先队列)
优先队列, 也是适配器。其内的元素不是按照被推入的顺序排序,而是自动取元素的权值排序,缺省情况下利用一个max_heap
完成,后者是以vector
表示的完全二叉树。
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_refernece;
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); }
template<class InputIterator>
priority_queue(InputIterator first, InputIterator last const Compare &x) :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 {
c.push_back(X);
push_heap(c.begin(), c.end(), comp);
}
_STL_UNWIND{c.clear()};
}
void pop() {
_STL_TRY {
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
_STL_UNWEIND{c.clear()};
}
};
// priority_queue⽆迭代器