C++ 優先級隊列

一、引言

  • 隊列的特性是先進先出
  • 優先級隊列的本質是一個有序隊列,根據成員的優先級,對隊列中的成員進行排序。
  • 優先級隊列默認是大頂堆,即堆頂元素最大

二、常用函數

  • empty()
  • size()
  • top()
  • push()
  • emplace()
  • pop()
  • swap()

三、代碼示例

class SS {public:SS(int _val = 0) : val(_val) {}bool operator<(const SS& ss) const { return val < ss.val; } // 聲明 pq1 的基礎bool operator>(const SS& ss) const { return val > ss.val; } // 聲明 pq2 的基礎int val;
};struct SS_Compare {public:bool operator()(const SS& ss1, const SS& ss2) const { // 聲明 pq 的基礎return ss1.val < ss2.val;}
};int main() {priority_queue<SS, vector<SS>, SS_Compare> pq;priority_queue<SS, vector<SS>, less<SS>> pq1;priority_queue<SS, vector<SS>, greater<SS>> pq2;pq.push(SS(1));pq.push(SS(2));pq.push(SS(3));vector<SS> v;sort(v.begin(), v.end(), SS_Compare());while (!pq.empty()) {std::cout << pq.top().val << std::endl;pq.pop();}return 0;
}

四、自定義排序方法

在上述的代碼示例中,展示了三種使用自定義排序函數的方法:

  • 使用仿函數
  • 重載<,然后使用less
  • 重載>,然后使用greater

注意到,在使用仿函數的時候,我們給優先級隊列傳遞的是類型,而在sort()函數中使用仿函數的時候,我們傳遞的實參是臨時函數對象。
這個差異源于優先級隊列(priority_queue)和排序算法(sort)在C++中不同的設計方式。
那為什么要這么設計呢???

  1. 優先級隊列: 需要存儲比較器作為成員變量,因此需要在構造時知道類型
  2. 排序算法: 是一次性操作,可以直接接受一個比較器對象
    這種設計差異是C++標準庫的歷史和實用性的結果,反映了不同容器和算法的使用模式。

五、容器

優先級隊列使用的默認容器是vector,也可以選用deque或者自定義容器類型。
但自定義容器類型必須滿足一些要求才能被優先級隊列接受。
此外,默認容器vector已經足夠高效,所以通常不建議使用自定義容器。

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

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

相關文章

學習筆記(27):線性回歸基礎與實戰:從原理到應用的簡易入門

線性回歸&#xff1a;通過擬合線性方程&#xff08;如 \(y w_1x_1 w_2x_2 b\)&#xff09;預測房價、銷售額等連續變量&#xff0c;需掌握特征標準化、正則化&#xff08;L1/L2&#xff09;防止過擬合。應用場景&#xff1a;金融領域的股價預測、電商用戶消費金額預估。 線性…

kubesphere安裝openelb

kubesphere安裝openelb 1.安裝openelb 2.修改配置文件 1.命令直接修改 $ kubectl edit configmap kube-proxy -n kube-system ipvs:strictARP: truemode: "ipvs"重啟kube-proxy組件 $ kubectl rollout restart daemonset kube-proxy -n kube-system 2.通過界面去修…

數據庫10:MySQL的數據類型與約束和屬性設置,數據模式

一.數據類型 整數類型&#xff08;integer types&#xff09; 數據類型字節有符號范圍無符號范圍說明tinyint1-128 ~ 1270 ~ 255非常小的整數smallint2-32,768 ~ 32,7670 ~ 65,535小整數mediumint3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等整數int4-2,147,483,648 ~ 2,147,4…

uniapp項目中node_modules\sass\sass.dart.js的體積過大怎么處理

用Node-Sass替代&#xff08;如果適用&#xff09;&#xff1a;雖然Dart Sass是Sass的主要實現之一&#xff0c;但有時它可能會比Node-Sass占用更多的空間。如果你不需要Dart Sass特有的功能&#xff0c;可以考慮切換到Node-Sass&#xff08;注意Node-Sass已停止維護&#xff0…

界面組件DevExpress WPF中文教程:Grid - 如何獲取節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Kalibr解毒填坑(一):相機標定失敗

文章目錄 ??簡介?? 解毒踩坑?? 主點錯誤??簡介 相機內參標定通常涉及確定焦距(fx, fy)、主點(cx, cy)、畸變系數(徑向和切向)等參數。Kalibr是一個開源的標定工具,支持多相機、IMU和聯合標定,適用于復雜的傳感器系統。 但kalibar標定相機內參受到數據和配置影…

Swift 的基礎設計哲學是 “通過模塊化組合實現安全與效率的平衡“,就像用標準化工業零件建造摩天大樓

一、基礎模塊&#xff1a;地基與鋼結構&#xff08;Basic Types & Collections&#xff09; 比喻&#xff1a;積木與工具箱&#xff0c;決定建筑的穩定性和容量。場景&#xff1a;搭建程序的基礎結構&#xff0c;如變量、數據類型、運算符。包含&#xff1a;基本語法、運算…

【RK3568+PG2L50H開發板實驗例程】Linux部分/FPGA dma_memcpy_demo 讀寫案例

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.案例簡介 案例功能描述&#xff1a;ARM端利用 PCIe總線對 FPGA的 DRAM執行讀寫操作。應用程序通過 ioctl函數觸發 …

7.3實驗部分

一、HDFS基礎操作 以root用戶登錄&#xff0c;創建如下HDFS目錄&#xff1a; /dw/yourname/input hadoop fs -mkdir -p /dw/zhanggengchen/input /dw/yourname/output hadoop fs -mkdir -p /dw/zhanggengchen/output 輸出結果&#xff1a; [rootmaster hadoop-mapreduce]# ha…

[nett5: AddressedEnvelope]-源碼解析

AddressedEnvelope AddressedEnvelope<M, A> 表示一個帶有發送者和接收者地址的消息封裝&#xff0c;常用于處理如 UDP 數據報這類含地址信息的通信場景。 public interface AddressedEnvelope<M, A extends SocketAddress> {// 實際的消息內容M content();// 消…

基于 Drone CI 實現前端自動化打包并集成 Spug 自動發布流程

前言&#xff1a;代碼自動化部署目前使用的是Spug開源運維平臺&#xff0c;通過docker直接部署該平臺后&#xff0c;在前端自動化打包&#xff08;npm run build&#xff09;會遇見Node的版本問題&#xff0c;因為Spug容器使用的是Centos7&#xff0c;所以Node版本只支持V16&am…

【基礎】Golang語言開發環境搭建(Linux主機)

目錄 1. 下載并安裝Go語言2. 配置環境變量3. 驗證安裝4. 配置Go模塊5. 安裝常用開發工具6. 配置IDE&#xff08;可選&#xff09;7. 第一個Go程序 在Linux主機上搭建Golang開發環境&#xff0c;你可以按照以下步驟進行操作&#xff1a; 1. 下載并安裝Go語言 首先從官網下載Go…

MySQL安全加固:使用mysql_secure_installation

在安裝MySQL后&#xff0c;為了確保服務器的安全性&#xff0c;建議使用mysql_secure_installation工具對MySQL進行安全加固。這個工具可以幫助我們完成一些關鍵的安全配置&#xff0c;包括設置強密碼、移除匿名用戶、限制root用戶的遠程登錄以及清理默認的測試數據庫等。以下是…

設計模式之中介者模式 (Mediator Pattern) -聊天室-控制室

中介者模式用于減少多個對象之間的直接通信&#xff0c;而是通過一個中介對象來協調它們之間的交互。下面我用一個聊天室的例子來演示這個模式。 舉個栗子&#xff1a;聊天室系統 在這個系統中&#xff0c;用戶不直接相互發送消息&#xff0c;而是通過聊天室&#xff08;中介者…

SpringSecurity01

目錄 一、權限控制 二、相關框架 1、shiro 2、springsecurity 三、springsecurity使用流程 1、搭建環境實現默認用戶名和密碼登錄 2、使用數據庫表中定義好的用戶名和密碼訪問實現等值密碼匹配 1&#xff09;sql文件 2)搭建jdbc或者mybatis或者mybatis-plus環境 3&am…

解決git clone報錯:fatal unable to access xxx. Could not resolve host github.com

作者&#xff1a;唐叔在學習 專欄&#xff1a;問題百寶箱 文章目錄 問題描述問題診斷網絡連通性測試 解決方案1. 獲取GitHub最新IP地址2. 修改系統hosts文件 驗證解決方案常見問題解答總結 問題描述 當使用git clone命令克隆GitHub倉庫時&#xff0c;可能會遇到如下錯誤&#…

魔術方法__call__

__call__ 是一個特殊方法&#xff08;也稱為魔術方法&#xff09;&#xff0c;用于使一個類的實例能夠像函數一樣被調用。當定義了這個方法后&#xff0c;實例對象可以后接括號&#xff08;即 ()&#xff09;來觸發調用&#xff0c;這會讓實例表現得像函數一樣。 ?使實例可調…

PHP中的異常處理與錯誤日志記錄

在PHP編程實踐中&#xff0c;異常處理是一項至關重要的技能&#xff0c;它能夠幫助開發者識別和響應程序執行過程中發生的非預期事件。與此同時&#xff0c;錯誤日志記錄是確保應用程序可靠性和穩定性的關鍵組成部分。本文將詳細介紹如何在PHP中實現這兩個方面的技術。 首先&a…

JS去除空格(數組內字符串)

1.JS中去除空格 去除這個數組中每個對象內部參數&#xff08;也就是屬性值&#xff09;的空格&#xff0c;可以通過遍歷數組&#xff0c;再遍歷每個對象的屬性&#xff0c;使用 trim() 方法來去除字符串首尾的空格。以下是具體實現代碼&#xff1a; let data [{ designHours:…

【Spring篇01】:Bean的線程安全問題總結

文章目錄 1. 核心問題&#xff1a;Spring 框架中的 Bean 是線程安全的嗎&#xff1f;2. 最佳實踐與解決方案禁止方案&#xff1a;濫用prototype作用域推薦方案&#xff08;按優先級排序&#xff09; 3. 生產環境中的典型案例Case 1&#xff1a;訂單服務統計Case 2&#xff1a;用…