深入理解C++中的stack、queue和priority_queue

目錄

前言

1. stack(棧)

1.1 基本概念

1.2 常用接口

1.3 應用示例:最小棧

1.4 模擬實現

2. queue(隊列)

2.1 基本概念

2.2 常用接口

2.3 模擬實現

3. priority_queue(優先隊列)

3.1 基本概念

3.2 常用接口

3.3 自定義比較方式

3.4 自定義類型使用

4. 容器適配器

4.1 什么是適配器

4.2 為什么選擇deque作為默認底層容器

5. 實際應用

5.1 棧的應用

5.2 隊列的應用

5.3 優先隊列的應用

總結


前言

在C++標準模板庫(STL)中,stack、queue和priority_queue是三種非常重要的容器適配器。它們建立在其他基礎容器之上,提供了特定的數據訪問方式。本文將詳細介紹這三種容器適配器的特性、使用方法和底層實現原理。


1. stack(棧)

1.1 基本概念

stack是一種后進先出(LIFO)的數據結構,只允許在容器的一端進行插入和刪除操作。它作為容器適配器實現,底層可以使用vector、deque或list等容器。


?

#include <stack>
std::stack<int> s; ?// 默認使用deque作為底層容器

1.2 常用接口

- `push()`: 壓棧
- `pop()`: 出棧
- `top()`: 訪問棧頂元素
- `empty()`: 判斷是否為空
- `size()`: 返回元素個數

1.3 應用示例:最小棧
?

class MinStack {
public:void push(int x) {_elem.push(x);if(_min.empty() || x <= _min.top())_min.push(x);}void pop() {if(_min.top() == _elem.top())_min.pop();_elem.pop();}int top() { return _elem.top(); }int getMin() { return _min.top(); }private:std::stack<int> _elem;std::stack<int> _min;
};

1.4 模擬實現

template<class T, class Con = std::deque<T>>
class stack {
public:void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_back(); }T& top() { return _c.back(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }
private:Con _c;
};


?

2. queue(隊列)

2.1 基本概念

queue是一種先進先出(FIFO)的數據結構,允許在一端插入元素,在另一端刪除元素。它同樣作為容器適配器實現,底層可以使用deque或list。


?

#include <queue>
std::queue<int> q; ?// 默認使用deque作為底層容器


?

2.2 常用接口

- `push()`: 入隊
- `pop()`: 出隊
- `front()`: 訪問隊頭元素
- `back()`: 訪問隊尾元素
- `empty()`: 判斷是否為空
- `size()`: 返回元素個數

2.3 模擬實現


template<class T, class Con = std::deque<T>>
class queue {
public:
? ? void push(const T& x) { _c.push_back(x); }
? ? void pop() { _c.pop_front(); }
? ? T& front() { return _c.front(); }
? ? T& back() { return _c.back(); }
? ? size_t size() const { return _c.size(); }
? ? bool empty() const { return _c.empty(); }
private:
? ? Con _c;
};

?

3. priority_queue(優先隊列)

3.1 基本概念

priority_queue是一種特殊的隊列,它的第一個元素總是最大的(默認大頂堆)。底層通常使用vector實現,并通過堆算法維護結構。


?

#include <queue>
std::priority_queue<int> pq; ?// 默認大頂堆


?

3.2 常用接口

- `push()`: 插入元素
- `pop()`: 刪除堆頂元素
- `top()`: 訪問堆頂元素
- `empty()`: 判斷是否為空
- `size()`: 返回元素個數

3.3 自定義比較方式


?

// 小頂堆
std::priority_queue<int, std::vector<int>, std::greater<int>> min_pq;


?

3.4 自定義類型使用

class Date {
public:// ... 構造函數等 ...bool operator<(const Date& d) const { /* 比較邏輯 */ }bool operator>(const Date& d) const { /* 比較邏輯 */ }
};// 使用
std::priority_queue<Date> pq; ?// 大頂堆
std::priority_queue<Date, std::vector<Date>, std::greater<Date>> min_pq;


?

4. 容器適配器

4.1 什么是適配器

適配器是一種設計模式,它將一個類的接口轉換成客戶希望的另一個接口。STL中的stack、queue和priority_queue都是容器適配器,它們基于其他容器(如deque、vector)實現特定功能。

4.2 為什么選擇deque作為默認底層容器

1. stack和queue不需要遍歷,只需要在固定端操作
2. deque在元素增長時比vector高效(不需要搬移大量數據)
3. 相比list,deque空間利用率更高

5. 實際應用

5.1 棧的應用

- 逆波蘭表達式求值
- 括號匹配
- 函數調用棧

5.2 隊列的應用

- 廣度優先搜索(BFS)
- 任務調度
- 消息隊列

5.3 優先隊列的應用

- 任務優先級調度
- Dijkstra算法
- 哈夫曼編碼


總結

stack、queue和priority_queue是C++ STL中三種重要的容器適配器,它們基于其他容器實現,提供了特定的數據訪問方式。理解它們的特性和底層實現原理,對于編寫高效、清晰的代碼非常重要。在實際開發中,根據具體需求選擇合適的容器,可以大大提高程序的性能和可維護性。

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

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

相關文章

C++ 操作 Redis 客戶端

引言 前面幾篇文章都在介紹 Redis 原生命令行客戶端&#xff0c;在實際應用開發中&#xff0c;開發人員更希望使用針對特定編程語言的專用客戶端&#xff0c;通過編程的方式操作 Redis 數據庫。因此&#xff0c;Redis 支持多種編程語言。本文將介紹 如何使用 C 語言來操作 Red…

批量提問程序開發方案:基于Python的百度文小言接口實現

批量提問程序開發方案&#xff1a;基于Python的百度文小言接口實現 1. 項目概述 1.1 項目背景 在現代信息檢索和自動化辦公場景中&#xff0c;批量提問功能已成為提高工作效率的重要工具。本項目旨在開發一個基于Python的批量提問程序&#xff0c;專門針對百度文小言平臺&am…

Apollo中三種相機外參的可視化分析

Apollo中三種相機外參的可視化分析一、什么是相機外參&#xff1f;為什么需要可視化&#xff1f;二、不同外參來源對比三、詳細操作步驟1. 環境準備2. 獲取 NuScenes外參數據3. 外參到空間位置的轉換及可視化四、可視化對比1. NuScenes數據集外參2. Apollo BEV模型外參3. Apoll…

虛擬化KVM常用命令匯總

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一種開源的硬件虛擬化解決方案&#xff0c;它是 Linux 內核的一部分&#xff0c;允許在支持虛擬化技術的硬件&#xff08;如 Intel VT-x 或 AMD-V&#xff09;上運行虛擬機。KVM 將 Linux 內核轉變為一個裸機虛擬機監…

6s081環境配置以及使用vscode連接本地wsl2

6s081環境配置以及使用vscode連接wsl2 本人環境&#xff1a;windows11、wsl2ubuntu20.04 課程&#xff1a;6s081的2020版本的:https://pdos.csail.mit.edu/6.S081/2020/schedule.html 一、wsl2ubuntu20.04配置6s081環境 注&#xff1a;關于如何在window中安裝wsl&#xff0c;這…

C++實現線程池(3)緩存線程池

三. CachedThreadPool 的實現3.1 需求:動態調整線程數量&#xff1a;與 FixedThreadPool 不同&#xff0c;CachedThreadPool 的線程數量是動態調整的。當有新任務提交時&#xff0c;如果線程池中有空閑的線程&#xff0c;則會立即使用空閑線程執行任務&#xff1b;如果線程池中…

WMS+自動化立庫:無人倉的現在進行時

傳統倉庫正面臨嚴峻挑戰&#xff1a;效率瓶頸日益凸顯&#xff0c;人力成本持續攀升&#xff0c;空間利用率逼近極限&#xff0c;而訂單響應速度卻難以滿足市場需求。如何破局&#xff1f;WMS&#xff08;倉庫管理系統&#xff09;與自動化立體庫&#xff08;AS/RS&#xff09;…

多模態大模型研究每日簡報【2025-08-05】

訓練數據相關 EditGarment: An Instruction-Based Garment Editing Dataset Constructed with Automated MLLM Synthesis and Semantic-Aware Evaluation (https://arxiv.org/abs/2508.03497)&#xff1a;提出了一種自動化的流程&#xff0c;用于構建服裝編輯數據集EditGarmen…

4、docker數據卷管理命令 | docker volume

1、命令總覽命令作用出現頻率備注★ docker volume create新建卷高-d 指定驅動&#xff0c;-o 指定驅動選項★ docker volume ls列出卷高--filter danglingtrue 查孤兒卷★ docker volume inspect查看卷詳情高輸出 JSON&#xff0c;可加 --format★ docker volume rm刪除卷高只…

計數組合學7.14(對偶 RSK 算法)

7.14 對偶 RSK 算法 存在 RSK 算法的一種變體&#xff0c;其與乘積 ∏i,j(1xiyj)\prod_{i,j}(1 x_{i}y_{j})∏i,j?(1xi?yj?) 的關系類似于 RSK 算法本身與 ∏i,j(1?xiyj)?1\prod_{i,j}(1 - x_{i}y_{j})^{-1}∏i,j?(1?xi?yj?)?1 的關系。我們稱此變體為對偶 RSK 算法…

C語言中的進程、線程與進程間通信詳解

目錄 引言 基本概念 1. 進程&#xff08;Process&#xff09; 2. 線程&#xff08;Thread&#xff09; 線程編程實戰 1. 常見線程庫 2. 合理設置線程數 3. pthread 創建線程 線程同步機制 1. 互斥鎖 pthread_mutex_t 2. 條件變量 pthread_cond_t 3. 讀寫鎖 pthread…

[假面騎士] 555淺談

假面騎士555(faiz)是我最先接觸的一部平成系列的假面騎士&#xff0c;同時也是我個人最喜歡的一部假面騎士。一、大綱簡介震驚&#xff0c;人類最新的進化形態——奧菲一諾&#xff0c;橫空出世&#xff01;日本的頂級財團&#xff0c;Smart Brain&#xff0c;的前任社長&#…

Vue Router 路由的創建和基本使用(超詳細)

一、路由的基本概念 你是否好奇單頁應用&#xff08;SPA&#xff09;是如何在不刷新頁面的情況下實現頁面切換的&#xff1f;這就離不開路由的功勞。 路由&#xff1a;本質是一組 key-value 的對應關系&#xff0c;在前端領域中&#xff0c;key 通常是路徑&#xff0c;value …

深入理解設計模式:策略模式的藝術與實踐

在軟件開發中&#xff0c;我們經常會遇到需要根據不同情況選擇不同算法或行為的場景。傳統的做法可能是使用大量的條件語句&#xff08;if-else或switch-case&#xff09;&#xff0c;但隨著需求的增加和變化&#xff0c;這種硬編碼的方式會導致代碼難以維護和擴展。策略模式&a…

概率/期望 DP llya and Escalator

題目鏈接&#xff1a;Problem - D - Codeforces 看了這篇文章來的&#xff1a;【算法學習筆記】概率與期望DP - RioTian - 博客園 這篇博客寫得挺好的&#xff0c;講了一些常見方法&#xff0c;概率 / 期望的題多練練就上手了。 題目大意&#xff1a; n 個人排隊上電梯&…

大陸電子MBDS開發平臺轉到其他國產控制器平臺產生的問題記錄

u8_StComLowSpdGearSwt變量為例&#xff0c;之前用的時候只有輸入&#xff0c;沒什么實際意義&#xff0c;導致新環境下編譯報錯&#xff0c;缺少聲明&#xff0c;解決辦法&#xff1a;注釋掉輸入模塊。今天解決的另一個比較大的問題&#xff0c;不同模型函數公用函數模塊生成代…

機器學習模型調優實戰指南

文章目錄模型選擇與調優&#xff1a;從理論到實戰1. 引言2. 模型評估&#xff1a;為選擇提供依據2.1 偏差-方差權衡2.2 數據集劃分與分層抽樣2.3 交叉驗證&#xff08;Cross-Validation&#xff09;2.4 信息準則&#xff08;AIC / BIC&#xff09;3. 超參數調優&#xff1a;讓模…

【教程】Unity CI/CD流程

測試機&#xff1a;紅帽 Linux8 源碼倉庫&#xff1a;Gitee - MrRiver/Unity Example ? 系統環境準備 1&#xff09;yum 源 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo sudo sed -i s/\$releasever/8/g /etc/yum.repos…

文獻閱讀 | Briefings in Bioinformatics | Hiplot:全面且易于使用的生物醫學可視化分析平臺

文獻介紹文獻題目&#xff1a; Hiplot&#xff1a;一個綜合且易于使用的 Web 服務&#xff0c;用于增強出版物準備的生物醫學數據可視化 研究團隊&#xff1a; Openbiox/Hiplot 社區 發表時間&#xff1a; 2022-07-05 發表期刊&#xff1a; Briefings in Bioinformatics 影響因…

【數字圖像處理系列筆記】Ch04:灰度變換與空間域圖像增強(2)

目錄 一、空域濾波基礎 一、空域濾波的基本概念 二、空域濾波的數學原理 三、空域濾波器的分類與典型示例 &#xff08;一&#xff09;線性濾波器&#xff08;Linear Filter&#xff09; &#xff08;二&#xff09;非線性濾波器&#xff08;Non-linear Filter&#xff0…