C++ queue 和priority_queue

目錄

1.什么是queue

2.模擬實現

3.仿函數

模板參數Compare

仿函數

?4.什么是priority_queue

模擬實現


1.什么是queue

1.隊列是一種容器適配器,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素。


2.隊列作為容器適配器實現,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數來訪問其元素。元素從隊尾入隊列,從隊頭出隊列。


3.底層容器可以是標準容器類模板之一,也可以是其他專門設計的容器類。該底層容器應至少支持以下操作:

4.標準容器類dequelist滿足了這些要求。默認情況下,如果沒有為queue實例化指定容器類,則使用標準容器deque

empty:檢測隊列是否為空
size:返回隊列中有效元素的個數
front:返回隊頭元素的引用
back:返回隊尾元素的引用
push_back:在隊列尾部入隊列
pop_front:在隊列頭部出隊列

用法跟stack一樣,可以看上一篇文章

2.模擬實現

queue.h

#include "string.h"
#include<iostream>
#include<stack>
#include<deque>using namespace std;namespace lty
{template<class T, class Container = deque<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}T& front(){return _con.front();}T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void testqueue(){queue<int,deque<int>> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;}
}

queue.cpp

#include "queue.h"using namespace std;int main()
{lty::testqueue();
}

3.仿函數

模板參數Compare

#include <iostream>
#include <queue>int main() {std::priority_queue<int> maxHeap; // 默認大堆std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap; // 小堆maxHeap.push(5);maxHeap.push(3);maxHeap.push(8);minHeap.push(5);minHeap.push(3);minHeap.push(8);std::cout << "Max Heap (Top element): " << maxHeap.top() << std::endl;std::cout << "Min Heap (Top element): " << minHeap.top() << std::endl;return 0;
}

?

仿函數

仿函數實際就是一個類,這里類實例化出來的對象叫做函數對象,下面命名空間wyn中的兩個仿函數就分別是兩個類,在使用時直接用類進行實例化對象,然后讓對象調用()的運算符重載,這樣我們看到的調用形式就非常像普通的函數調用,但實際上這里并不是函數調用,而是仿函數實例化出來的對象調用了自己的operator()重載成員函數。


?

namespace lty
{template <class T>class less{public:bool operator()(const T& x, const T& y)const{return x < y;}};template <class T>class greater{public://將仿函數放成public,要不然class默認是私有的bool operator()(const T& x, const T& y)const{return x > y;}};
}
int main()
{lty::less<int> lessFunc;lty::greater<int> greaterFunc;lessFunc(1, 2);//你以為這里是函數調用,但他其實是仿函數對象lessFunc調用了他的成員運算符重載()函數。
}

?4.什么是priority_queue

優先級隊列的適配會更復雜一些些。它的適配容器用的是vector。

優先級隊列就不是什么先進先出了,它雖然叫隊列,但它不是真隊列。其實它的底層是堆,可以在任意時刻插入數據,默認是大堆,當然也可以通過仿函數去調整。

優先級隊列有一個反人類的設計:傳less仿函數,底層是大堆。傳greater仿函數,底層是小堆。

它的一些接口


priority_queue和queue以及stack一樣,他們都是由底層容器適配出來的適配器,之不過priority_queue采用的適配容器不再是deque而是vector,選擇vector的原因也非常簡單,在調用向上或向下調整算法時,需要大量頻繁的進行下標隨機訪問,這樣的情境下,vector就可以完美展現出自己結構的絕對優勢


模擬實現

#pragma oncenamespace lty
{// Compare進行比較的仿函數 less->大堆// Compare進行比較的仿函數 greater->小堆template<class T, class Container = vector<T>, class Compare = std::less<T>>class priority_queue{public:priority_queue(){}template <class InputIterator>         priority_queue(InputIterator first, InputIterator last){while (first != last){_con.push_back(*first);++first;}for (int i = (_con.size()-1-1)/2; i >= 0; --i){adjust_down(i);}}void adjust_up(size_t child){Compare com;size_t parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void adjust_down(size_t parent){Compare com;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]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con[0];}bool empty()  const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;};
}

命名空間 xzq:
這段代碼位于命名空間 xzq 中,這是一個自定義的命名空間,用于將相關的類、函數等封裝在一起,以避免與其他代碼的命名沖突。

模板類 priority_queue:
這是一個模板類,它代表了一個優先隊列的實現。它接受三個模板參數:T(元素類型),Container(底層容器類型,默認為 std::vector<T>),和 Compare(用于比較元素的仿函數,默認為 std::less<T>)

Compare 是一個模板參數,用于進行元素的比較。它是一個仿函數,可以是 std::less<T>(默認)或 std::greater<T>,具體取決于用戶提供的優先隊列類型。Compare 仿函數用于確定在堆中的元素排序方式,從而決定了是最大堆還是最小堆。在 priority_queue 類的各個成員函數中,通過調用 Compare 仿函數來進行元素的比較,從而實現了插入和調整堆的操作。

構造函數 priority_queue():
這是一個默認構造函數,不需要使用 Compare 仿函數進行比較。

構造函數模板 priority_queue(InputIterator first, InputIterator last):
在構造函數內部,使用 Compare 仿函數來執行比較操作,以確定元素的順序。在添加元素后,通過調用 adjust_down 函數來構建堆。

成員函數 adjust_up(size_t child):
在上浮操作中,使用 Compare 仿函數執行比較,以確定是否需要交換父子節點的位置,從而保持堆的性質。

成員函數 push(const T& x):
在插入操作中,首先將新元素添加到底層容器 _con,然后通過調用 adjust_up 函數來執行上浮操作,保證新元素位于合適的位置。

成員函數 adjust_down(size_t parent):
在下沉操作中,使用 Compare 仿函數執行比較,以確定是否需要交換父子節點的位置,從而保持堆的性質。

成員函數 pop():
在刪除操作中,首先將頂部元素與底層容器的最后一個元素交換,然后通過調用 adjust_down 函數來執行下沉操作,保證堆的性質。

成員函數 const T& top():
通過返回 _con[0],獲取優先隊列的頂部元素。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java轉Go學習之旅 | Go入門(1)

入門 命令行參數找出重復行常規版本涉及文件操作 命令行參數 命令行參數以os包中Args名字的變量供程序訪問&#xff0c;在os包外面&#xff0c;使用os.Args這個名字 變量os.Args是一個字符串sliceos.Args[0]&#xff1a;命令本身的名字os.Args[1:]&#xff1a;另外的元素&…

Cglib動態代理從入門到掌握

Cglib 動態代理 本文的寫作目的是為了探究 Spring 框架中在使用Transactional標注的方法中使用 this 進行自調用時事務失效的原因&#xff0c;各種視頻教程中只是簡單指出 this 指向的不是代理類對象&#xff0c;而是目標類對象&#xff0c;但是并沒有解釋為什么 this 不是代理…

麒麟系統使用桌面共享遠程桌面

客戶端安裝vinager 服務端 安裝 vnc4server xrdp tightvncserver vino 安裝完成后 需要重啟 在用戶的家目錄下新建 .xsession 寫入xfce4-session防止閃退 雪花屏 開啟xrdp服務 遠程鏈接 Vnc只能鏈接系統登錄的用戶 Rdp可以鏈接所有普通用戶

vscode插件webview和插件通信

如果你要在 VS Code 插件的 WebView 中調用插件中的方法&#xff0c;可以使用 vscode.postMessage API。具體步驟如下&#xff1a; 在插件中&#xff0c;在創建 WebView 時&#xff0c;指定一個 onDidReceiveMessage 回調方法&#xff0c;該方法會在 WebView 中調用 vscode.po…

【C語言】結構體內存對齊

目錄 引入結構體 結構的聲明 創建和初始化 內部元素的使用&#xff1b; 特殊聲明&#xff1a; 結構體在內存中的對齊 練習&#xff1a; 引入結構體 C語言有各種數據類型&#xff0c;我們已經對一些數據類型很熟悉&#xff1a; 整型&#xff08;int&#xff09;- 存儲整…

力扣-151. 反轉字符串中的單詞

文章目錄 看下去&#xff0c;你一定可以理解此題&#xff0c;寫的簡單易懂力扣題目解題思路函數構成1.反轉函數2.消除掉多余空格函數 整體函數 看下去&#xff0c;你一定可以理解此題&#xff0c;寫的簡單易懂 力扣題目 給你一個字符串 s &#xff0c;請你反轉字符串中 單詞 …

京東商品詳情數據在數據分析行業中的重要性

京東商品詳情數據在數據分析行業中具有重要作用。這些數據提供了豐富的信息&#xff0c;可以幫助企業了解市場趨勢、消費者需求、產品表現以及運營策略等多個方面。 首先&#xff0c;京東商品詳情數據可以為企業提供市場趨勢分析的依據。通過觀察商品的銷售量、銷售額、價格等…

c語言:理解和避免野指針

野指針的定義&#xff1a; 野指針是指一個指針變量存儲了一個無效的地址&#xff0c;通常是一個未初始化的指針或者指向已經被釋放的內存地址。當程序嘗試使用野指針時&#xff0c;可能會導致程序崩潰、內存泄漏或者其他不可預測的行為。因此&#xff0c;在編程中需要特別注意…

Pandas中DataFrame對象的創建與常用屬性方法(第2講)

Pandas中DataFrame對象的創建與常用屬性方法(第2講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ???????????????????????????????????????????????????????????????????????????…

智能優化算法應用:基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于孔雀算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.孔雀算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-2 特征值與特征向量

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-數學基礎Ch0-2 特征值與特征向量 1. 定義1.1 線性變換1.2 求解特征值&#xff0c;特征向量1.3 應用&#xff1a;對角化矩陣——解耦Decouple 2. Summary 1. 定義 A v ? λ v ? A\vec{v}\lambd…

【網絡奇緣】- 計算機網絡|深入學習物理層|網絡安全

? &#x1f308;個人主頁: Aileen_0v0&#x1f525;系列專欄: 一見傾心,再見傾城 --- 計算機網絡~&#x1f4ab;個人格言:"沒有羅馬,那就自己創造羅馬~" 回顧鏈接&#xff1a;http://t.csdnimg.cn/ZvPOS 這篇文章是關于深入學習原理參考模型-物理層的相關知識點&…

Linux權限命令詳解

Linux權限命令詳解 文章目錄 Linux權限命令詳解一、什么是權限&#xff1f;二、權限的本質三、Linux中的用戶四、linux中文件的權限4.1 文件訪問者的分類&#xff08;人&#xff09;4.2 文件類型和訪問權限&#xff08;事物屬性&#xff09; 五、快速掌握修改權限的做法【第一種…

Spark-Streaming+Kafka+mysql實戰示例

文章目錄 前言一、簡介1. Spark-Streaming簡介2. Kafka簡介二、實戰演練1. MySQL數據庫部分2. 導入依賴3. 編寫實體類代碼4. 編寫kafka主題管理代碼5. 編寫kafka生產者代碼6. 編寫Spark-Streaming代碼總結前言 本文將介紹一個使用Spark Streaming和Kafka進行實時數據處理的示例…

實戰1-python爬取安全客新聞

一般步驟&#xff1a;確定網站--搭建關系--發送請求--接受響應--篩選數據--保存本地 1.拿到網站首先要查看我們要爬取的目錄是否被允許 一般網站都會議/robots.txt目錄&#xff0c;告訴你哪些地址可爬&#xff0c;哪些不可爬&#xff0c;以安全客為例子 2. 首先測試在不登錄的…

Docker Network(網絡)——8

目錄&#xff1a; Docker 為什么需要網絡管理Docker 網絡架構簡介 CNMLibnetwork驅動常見網絡類型 bridge 網絡host 網絡container 網絡none 網絡overlay 網絡docker 網絡管理命令 docker network createdocker network inspectdocker network connectdocker network disconne…

class072 最長遞增子序列問題與擴展【算法】

class072 最長遞增子序列問題與擴展【算法】 code1 300. 最長遞增子序列 // 最長遞增子序列和最長不下降子序列 // 給定一個整數數組nums // 找到其中最長嚴格遞增子序列長度、最長不下降子序列長度 // 測試鏈接 : https://leetcode.cn/problems/longest-increasing-subsequen…

830. 單調棧

?????? ??????830. 單調棧 - AcWing題庫 給定一個長度為 N 的整數數列&#xff0c;輸出每個數左邊第一個比它小的數&#xff0c;如果不存在則輸出 ?1?1。 輸入格式 第一行包含整數 N&#xff0c;表示數列長度。 第二行包含 N個整數&#xff0c;表示整數數列…

你知道MySQL中 group by 怎么優化嗎

更好的閱讀體驗&#xff0c;請點擊 YinKai s Blog。 ? 在 MySQL 中 group by 用于按照一個或多個列對結果集進行分組。在討論 group by 怎么優化之前&#xff0c;我們先來看看 group by 的執行流程&#xff0c;這樣我們才能對癥下藥。 group by 執行流程 ? 我們先用下面的 …

Ubuntu 18.04使用Qemu和GDB搭建運行內核的環境

安裝busybox 參考博客&#xff1a; 使用GDBQEMU調試Linux內核環境搭建 一文教你如何使用GDBQemu調試Linux內核 ubuntu22.04搭建qemu環境測試內核 交叉編譯busybox 編譯busybox出現Library m is needed, can’t exclude it (yet)的解釋 S3C2440 制作最新busybox文件系統 https:…