探索實現C++ STL容器適配器:優先隊列priority_queue

前引:?在算法競賽中,選手們常常能在0.01秒內分出勝負;在實時交易系統中,毫秒級的延遲可能意味著數百萬的盈虧;在高并發服務器中,每秒需要處理數萬條不同優先級的請求——這些系統背后,都隱藏著同一種強大的數據結構:?優先隊列(priority_queue)?作為C++標準庫中最優雅的數據結構適配器,priority_queue完美封裝了堆算法的高效性,卻只需幾行代碼即可實現復雜優先級管理。本文將深入剖析:

(1)?堆原理與優先隊列的機械美學?

(2)定制化優先級策略的高級技巧?

(3)實戰性能對比與編譯器級優化?

(4)在萬億級數據處理中的獨特優勢

目錄

優先隊列介紹

優先隊列的淵源

實例化

插入元素

訪問元素

獲取元素個數

判斷優先隊列是否為空

刪除堆頂元素

·

優先隊列的模擬實現

類模板

插入元素

訪問元素

獲取元素個數

判斷優先隊列是否為空

刪除堆頂元素

效果展示


優先隊列介紹

優先隊列priority_queue 是 C++ 標準模板庫(STL)中的一個容器適配器,提供了堆數據結構的實現(默認為最大堆)。它在需要高效訪問最大/最小元素的場景下非常有用!

如果需要使用小頂堆,可以這樣傳參 priority_queue< int , vector<int> , greater<int> >?

它是默認基于(大頂)堆實現的,例如一顆用數組存儲的完全二叉樹:

特點總結:

(1)采用數組形式存儲

(2)默認基于最大堆實現

(3)適配器容器底層為 vector?(使用需要包含#include<queue>)?

(4)每次只能訪問隊列頂部的元素,即優先級最高的元素

(5)復雜度:訪問O(1)、插入O(log n)、刪除頂部元素O(log n)

優先隊列的淵源

我們通過 優先隊列 的容器結構應該猜到,它的底層容器是 vector ,為什么不取名叫優先維克托呢

問:為什么底層容器是vector?

連續內存結構適合堆的隨機訪問需求,緩存友好,且動態數組支持高效尾部操作

問:為什么頭文件是queue?

作為容器適配器,優先隊列在概念上屬于隊列的一種,與queue共用同一頭文件,體現了接口的一致性,比如隊列的各種接口剛好吻合它的訪問、插入、刪除行為:

priority_queue --> "<queue>頭文件" : 聲明接口

問:為什么叫優先隊列而不是優先維克托?

名稱語義分解?:

優先(Priority):元素按內在重要性排序,而非插入順序

隊列(Queue):僅允許特定端點訪問的操作模型(隊尾插入,隊首訪問)

?行為本質?:

插入操作:push(),時間復雜度 O(log n)

訪問操作:top(),總是獲取優先級最高的元素

刪除操作:pop(),移除當前最高優先級元素

實例化

采用:priority_queue<數據類型> 變量名;

我們可以選擇默認初始化:

priority_queue<int> V1;

也可以選擇范圍初始化:

priority_queue<int> V2(arr,arr+n);
//或者用另一個容器去初始化
priority_queue<int> V3(V1.begin(),V1.end());

效果展示:?

插入元素

V.push(val);

訪問元素

遵循堆的性質,只能訪問堆頂元素

V.top();

獲取元素個數

V.size();

判斷優先隊列是否為空

V.empty();

為空返回 true ;不為空返回 false

刪除堆頂元素

V.pop();

優先隊列的模擬實現

類模板

template<class T, class contain = vector<T>>
class priority_queue
{
public://構造可以不寫,因為可以直接使用vector//函數實現
private:contain x;
}

既然底層是 vector,我們用缺省參數直接實例化出一個 vector 類型的變量就可以作為底層實現了

插入元素

插入元素調用vector的接口就行了,這里由于需要滿足優先隊列的性質(大頂堆),我們還需要在插入之后使用向上調整,保證堆頂(首元素)是最大的

插入元素:

//插入數據
void push(const T& date)
{x.push_back(date);//向上調整Upgrade(size() - 1);
}

向上調整:

//向上調整
void Upgrade(int child)
{//父節點int parent = (child - 1) / 2;//如果孩子節點大于父節點,就向上調整交換(根節點可能也需要調整)while (parent >= 0){//只要進入循環,那么節點下標一定是在合法范圍if (x[child] > x[parent]){//交換swap(x[child], x[parent]);//更新孩子、父節點child = parent;parent = (child - 1) / 2;}elsebreak;}
}

這樣經過向上調整就可以達到下面的效果:

訪問元素

訪問第一個元素即可(堆頂元素)

//訪問元素
T top()
{return x[0];
}

獲取元素個數

//計算元素個數
T size()
{return x.size();
}

判斷優先隊列是否為空

//判斷是否為空
bool empty()
{return x.empty();
}

刪除堆頂元素

這里的刪除調用 vector的尾刪即可。

刪除的方法:先交換堆頂 和 尾部元素,再刪除,再使用向下調整保證大頂堆的性質

//刪除堆頂元素
void pop()
{Eliminate(size() - 1);
}

向下調整:?

//向下調整
void Eliminate(int child)
{//交換堆頂和末尾元素swap(x[child], x[0]);//去尾x.pop_back();//父子節點int parent = 0;child = 2 * parent + 1;//開始調整(子節點不能超過范圍)while (child < x.size()){//如果右節點大于左節點if (x[child] < x[child + 1]){child++;}//如果父節點小于子節點if (x[parent] < x[child]){swap(x[parent], x[child]);//更新parent = child;child = 2 * parent + 1;}elsebreak;}
}

效果展示

void text1_t()
{priority_queue<int> V1;//插入元素V1.push(10);V1.push(15);V1.push(5);V1.push(20);V1.push(0);V1.push(25);//元素個數cout << V1.size() << endl;//訪問堆頂元素cout << V1.top() << endl;//出堆頂元素V1.pop();//訪問堆頂元素cout << V1.top() << endl;//判斷是否為空cout << V1.empty() << endl;
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【霧非霧】期待與你的下次相遇!?

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

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

相關文章

一、Dify 私有部署、本地安裝教程(LInux-openeuler)

官網&#xff1a;Dify AI Plans and Pricing 1.找到下載的位置。 2.可以切換文檔為中午文檔。 3.本次安裝使用Docker Compose 安裝&#xff0c;可以大致看一下文檔描述的配置信息要求。 4.各個版本信息&#xff0c;本次下載1.5.1版本&#xff0c;你也可以選擇安裝其他版本。 …

GASVM+PSOSVM+CNN+PSOBPNN+BPNN軸承故障診斷

一、各算法基本原理與技術特點 1. GASVM&#xff08;遺傳算法優化支持向量機&#xff09; 原理&#xff1a; 利用遺傳算法&#xff08;GA&#xff09;優化SVM的超參數&#xff08;如懲罰因子 C C C 和核函數參數 g g g&#xff09;。遺傳算法通過模擬自然選擇機制&#xff…

Python實例練習---魔法方法

&#xff08;主頁有對應知識點^V^&#xff09; 【練習要求】 針對知識點Python面向對象的魔法方法安排的本實例。要求實現&#xff1a;用__init__魔法方法定義書的長&#xff0c;寬&#xff0c;高&#xff0c;最后用__str__輸出返回值 【重要步驟提示】 定義class書類 2、使…

【從0-1的CSS】第3篇:盒子模型與彈性布局

文章目錄 盒子模型內容區content內邊距padding邊框border外邊距margin元素的寬度高度box-sizing屬性content-box&#xff1a;設置的width和height就是內容區的width和heightborder-box:設置的width和height是context padding border的width和height 彈性布局Flex容器的屬性fl…

設置LInux環境變量的方法和區別_Ubuntu/Centos

Linux環境變量可以通過export實現&#xff0c;也可以通過修改幾個文件來實現 1 通過文件設置LInux環境變量 首先是設置全局環境變量&#xff0c;對所有用戶都會生效 /etc/profile&#xff1a;該文件為系統的每個用戶設置環境信息&#xff0c;當用戶登錄時&#xff0c;該文件…

python緩存裝飾器實現方案

寫python的時候突然想著能不能用注解于是就寫了個這個 文章目錄 原始版改進點 原始版 import os import pickle import hashlib import inspect import functoolsdef _generate_cache_filename(func, *args, **kwargs):"""生成緩存文件名的內部函數""…

使用 java -jar xxxx.jar 運行 jar 包報錯: no main manifest attribute

1、問題描述 在Linux服務器上本想運行一下自己寫的一個JAR&#xff0c;但是報錯了&#xff01; no main manifest attribute, in first-real-server-1.0-SNAPSHOT.jar 2、解決辦法 在自己的Spring項目的啟動類&#xff08;xxx.xxx.xxx.XXXXApplication&#xff09;所在的Mo…

信號與槽的總結

信號與槽的總結 QT中的信號與Linux的信號對比 1&#xff09;信號源 2&#xff09;信號的類型 3&#xff09;信號的處理方式 QT信號與Linux信號的深度對比分析 一、信號源對比 QT信號 用戶定義信號 &#xff1a;由開發者通過 signals:關鍵字在QObject派生類中顯式聲明 cl…

Python Mitmproxy詳解:從入門到實戰

一、Mitmproxy簡介 Mitmproxy是一款開源的交互式HTTPS代理工具&#xff0c;支持攔截、修改和重放HTTP/HTTPS流量。其核心優勢在于&#xff1a; 多平臺支持&#xff1a;兼容Windows、macOS、Linux三端工具&#xff1a;提供命令行(mitmproxy)、Web界面(mitmweb)、數據流處理(mi…

刷題筆記--串聯所有單詞的子串

題目&#xff1a;1、我的寫法&#xff08;超時&#xff09;從題面自然想到先用回溯算法把words的全排列先算出來&#xff0c;然后遍歷字符串s一次將符合條件的位置加入結果全排列計算所有可能字符串算法寫法&#xff1a;這是一個模板用于所有全排列算法的情況&#xff0c;本質思…

操作系統【1】【硬件結構】【操作系統結構】

一、CPU如何執行程序&#xff1f; 提綱 圖靈機工作方式馮諾依曼模型線路位寬CPU位寬程序執行基本過程執行具體過程 1. 圖靈機工作方式 圖靈機可以視作“一臺帶規則的自動草稿機” 圖靈機基本組成&#xff1a; 紙帶&#xff08;內存&#xff09;&#xff1a;連續格子組成&…

SQLite與MySQL:嵌入式與客戶端-服務器數據庫的權衡

SQLite與MySQL&#xff1a;嵌入式與客戶端-服務器數據庫的權衡 在開發應用程序時&#xff0c;數據庫選擇是一個至關重要的決策&#xff0c;它會影響應用的性能、可擴展性、部署難度和維護成本。SQLite和MySQL是兩種廣泛使用的關系型數據庫管理系統&#xff0c;它們各自針對不同…

CppCon 2018 學習:Smart References

“強類型別名”&#xff08;strong typedefs&#xff09; 的動機和實現&#xff0c;配合一個簡單例子說明&#xff1a; 動機&#xff08;Motivation&#xff09; 用 using filename_t string; 和 using url_t string; 來區分不同的字符串類型&#xff08;比如文件名和網址&…

高性能高準確度的CPU電壓與溫度監測軟件HWInfo

&#x1f5a5;? 一、軟件概述 Windows版&#xff1a;圖形化界面&#xff0c;支持實時監控&#xff08;溫度、電壓、風扇轉速等&#xff09;、基準測試及報告生成&#xff0c;兼容Windows XP至Windows 11系統。Linux版&#xff1a;命令行工具&#xff0c;由openSUSE社區維護&a…

H3C WA6322 AP版本升級

1、查看當前版本&#xff1a;R2444P01 2、官網下載升級文件&#xff1a; WA6300系列版本說明H3C WA6300系列(適用于WA6330、 WA6322、WA6320H、WA6320、 WTU630H、WTU630、WA6330-LI、WA6320-C、WA6320-D、WA6320H-LI、WA6338、WA6322H、WTU632H-IOT、WAP922E、WAP923、WA6320…

用 YOLOv8 + DeepSORT 實現目標檢測、追蹤與速度估算

【導讀】 目標檢測與追蹤技術是計算機視覺領域最熱門的應用之一&#xff0c;廣泛應用于自動駕駛、交通監控、安全防護等場景。今天我們將帶你一步步實現一個完整的項目&#xff0c;使用YOLOv8 DeepSORT實現目標檢測、追蹤與速度估算。>>更多資訊可加入CV技術群獲取了解…

Python實例題:基于 Python 的簡單聊天機器人

Python實例題 題目 基于 Python 的簡單聊天機器人 要求&#xff1a; 使用 Python 構建一個聊天機器人&#xff0c;支持以下功能&#xff1a; 基于規則的簡單問答系統關鍵詞匹配和意圖識別上下文記憶功能支持多輪對話可擴展的知識庫 使用tkinter構建圖形用戶界面。實現至少 …

相機:Camera原理講解(使用OpenGL+QT開發三維CAD)

相機為三維場景提供了靈活便捷的視角變換和交互能力&#xff0c;通過相機操作可以實現全方位、各角度的場景瀏覽。 怎樣在三維場景中引入相機&#xff0c;怎樣處理和實現視角的放縮、移動、旋轉&#xff1f;在視角旋轉時以指定目標為中心又該怎樣處理&#xff1f; 原文&#…

開源的虛擬電廠預測數據:資源、應用與挑戰

引言 虛擬電廠(Virtual Power Plant, VPP)是一種通過聚合分布式能源資源(如太陽能、風能、儲能系統、電動汽車和可控負荷)來優化電力系統運行的數字化能源管理平臺。準確的預測數據是虛擬電廠高效運行的關鍵,而開源數據為研究者和企業提供了低成本、高透明度的解決方案。…

IDE全家桶專用快捷鍵----------個人獨家分享!!

給大家分享一下我個人整理的快捷鍵&#xff0c;其中包含對電腦的操作&#xff0c;以及在編寫代碼時的操作&#x1f680;Window系列1 WindowsR 開啟運行對話框--->輸入cmd啟動黑窗口?2 WindowsE 快速打開我的電腦 ?3 WindowsL 電腦鎖屏 ?4 WindowsD 顯示/恢復桌面 ?5 Win…