C++ STL : 模拟实现STL中的容器适配器priority_queue
生活随笔
收集整理的這篇文章主要介紹了
C++ STL : 模拟实现STL中的容器适配器priority_queue
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- priority_queue
- 文檔介紹
- 實現思路
- 思路
- 仿函數
- 實現
priority_queue
文檔介紹
文檔介紹
- empty():檢測容器是否為空
- size():返回容器中有效元素個數
- front():返回容器中第一個元素的引用
- push_back():在容器尾部插入元素
實現思路
思路
優先級隊列priority_queue就是數據結構中的堆, 作為容器適配器,其底層默認使用的容器是連續存儲的vector,然后通過向下調整算法將vector調整為堆的結構,所以完全可以服用之前實現heap的代碼,只需要在復用原有代碼的基礎上增加stl的特性即可。
下面是之前數據結構篇章時實現的堆
堆的實現
仿函數
由于C語言不能很好的支持泛型編程,所以當我們實現想分別實現大堆和小堆的時候就得修改其中的代碼,但是由于C++具有模板,就完全可以通過仿函數和模板來實現代碼的復用。
什么是仿函數? 其實就是使一個類能夠像函數一樣使用,要做到這一點只需要重載它的()運算符即可,只需要分別實現大小判斷的仿函數,就可以做到分別實現大小堆
template<class T>struct less{bool operator()(const T& x, const T& y){return x < y;}};template<class T>struct greater{bool operator()(const T& x, const T& y){return x > y;}};這里的greater是小堆,less是大堆。
實現了之后只需要在模板中傳遞對應的仿函數即可實現大小堆的選擇
庫中默認是大堆
實現
#include<vector>namespace lee {template<class T>struct less{bool operator()(const T& x, const T& y){return x < y;}};template<class T>struct greater{bool operator()(const T& x, const T& y){return x > y;}};template <class T, class Container = std::vector<T>, class Compare = less<T> >class priority_queue{public:priority_queue(){}template<class iterator>priority_queue(iterator begin, iterator end) : _con(begin, end){for (int i = (_con.size() - 2) / 2; i >= 0; i--){AdjustDown(i);}}void AdjustUp(size_t child){size_t parent = (child - 1) / 2;while (child > 0){if (_com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);}else{break;}child = parent;parent = (child - 1) / 2;}}void AdjustDown(size_t root){size_t parent = root;size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && _com(_con[child], _con[child + 1])){++child;}if (_com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);}else{break;}parent = child;child = parent * 2 + 1;}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top() const {return _con[0];}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;Compare _com;}; }總結
以上是生活随笔為你收集整理的C++ STL : 模拟实现STL中的容器适配器priority_queue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ STL : 模拟实现STL中的容
- 下一篇: s3c2440移植MQTT