priority_queue顧名思義,是一個具有權值概念的queue,它和queue一樣允許加入新元素、移除舊元素等功能。由于這是一個queue,是以隻允許在底部加入元素,從頂部取出元素。但優先隊列帶有權值概念,其内的元素自動按照元素的權值排序。權值最高者排在最前面。
STL的priority_queue用二叉堆來實作,關于二叉堆的實作以及堆排序在另外的文章:二叉堆、堆排序。而STL的heap預設是以vector為底層容器。priority_queue隻是在STL容器外又封裝了一層,是以它往往不被歸類為容器(container),而被歸類為容器擴充卡(container adapter)。
priority_queue的實作
template <typename T, typenmae Sequence = vector<T>, typename 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_reference;
protected:
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, const Compare& x) : c(first, last) {make_heap(c.begin, c.end(), comp);}
template <typename InputIterator>
priority_queue(InputIterator first, InputIterator 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 {
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_UNWIND(c.clear());
}
};