天天看點

STL容器:優先隊列priority_queue

       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());
	}
};