日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ STL : 模拟实现STL中的容器适配器priority_queue

發布時間:2024/4/11 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ STL : 模拟实现STL中的容器适配器priority_queue 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • priority_queue
      • 文檔介紹
      • 實現思路
        • 思路
        • 仿函數
      • 實現


priority_queue

文檔介紹

文檔介紹

  • 優先隊列是一種容器適配器,根據嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。
  • 此上下文類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優先隊列中位于頂部的元 素)。
  • 優先隊列被實現為容器適配器,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特 定的成員函數來訪問其元素。元素從特定容器的“尾部”彈出,其稱為優先隊列的頂部。
  • 底層容器可以是任何標準容器類模板,也可以是其他特定設計的容器類。容器應該可以通過隨機訪問迭 代器訪問,并支持以下操作:
    • empty():檢測容器是否為空
    • size():返回容器中有效元素個數
    • front():返回容器中第一個元素的引用
    • push_back():在容器尾部插入元素
  • 標準容器類vector和deque滿足這些需求。默認情況下,如果沒有為特定的priority_queue類實例化指 定容器類,則使用vector。
  • 需要支持隨機訪問迭代器,以便始終在內部保持堆結構。容器適配器通過在需要時自動調用算法函數 make_heap、push_heap和pop_heap來自動完成此操作。

  • 實現思路

    思路

    優先級隊列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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。