C++ 優先佇列的使用
阿新 • • 發佈:2019-02-18
首先看下優先佇列的STL原始碼:
class priority_queue { protected: _Sequence c; ///容器 _Compare comp; ///比較準則 public: bool empty() const { return c.empty(); } size_type size() const { return c.size(); } const_reference top() const { __glibcxx_requires_nonempty(); return c.front(); } void push(const value_type& __x) { try { c.push_back(__x); std::push_heap(c.begin(), c.end(), comp); } catch(...) { c.clear(); __throw_exception_again; } } void pop() { __glibcxx_requires_nonempty(); try { std::pop_heap(c.begin(), c.end(), comp); c.pop_back(); } catch(...) { c.clear(); __throw_exception_again; } } }
用法:
C++標頭檔案 #include <queue>
template<typename _Tp,
typename _Sequence = vector<_Tp>,
typename _Compare = less<typename _Sequence::value_type> >
第一個引數 _Tp: 指定儲存的型別名稱;
第二個引數 _Sequence: 指定儲存的資料結構,該結果必須支援隨機存取迭代器;
第三個引數 _Compare : 比較函式,對於自定義型別有兩種方法實現大小頂堆,第一個是過載操作符,第二個是寫一個結構實現比較。
各個資料型別演算法講解如下:
1. 對於一般的基本資料型別,比如 int,double等。
1). 預設是大頂堆,測試程式碼如下
int main() { priority_queue<int,vector<int>, less<int> > max; for(int i=0;i<10;i++){ max.push(rand()%20); } while(!max.empty()){ cout<<max.top()<<" "; max.pop(); } return 0; }