【C++干貨鋪】適配器 | stack | queue

=========================================================================

個人主頁點擊直達:小白不是程序媛

C++系列學習專欄:C++干貨鋪

代碼倉庫:Gitee

=========================================================================

目錄

stack的介紹和使用

stack的介紹

stack的使用

queue的介紹和使用

queue的介紹

queue的使用

容器適配器

什么是適配器

STL中stack和queue的底層結構

deque的介紹

deque的缺陷

為什么選擇deque作為stack和queue的底層默認容器?

stack的模擬實現

queue的模擬實現


stack的介紹和使用

stack的介紹

1. stack是一種容器適配器,專門用在具有后進先出操作的上下文環境中,其刪除只能從容器的一端進行元素的插入與提取操作。

2. stack是作為容器適配器被實現的,容器適配器即是對特定類封裝作為其底層的容器,并提供一組特定的成員函數來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出。

3. stack的底層容器可以是任何標準的容器類模板或者一些其他特定的容器類,這些容器類應該支持以下操作

  • empty:判空操作
  • back:獲取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部刪除元素操作

4. 標準容器vector、deque、list均符合這些需求,默認情況下,如果沒有為stack指定特定的底層容器,默認情況下使用deque
?

?

stack的使用

函數名稱

函數作用

stack()構造空的棧
empty()檢測stack是否為空
size()返回stack中元素的個數
top()返回棧頂元素的引用
push()將元素val壓入stack中
pop()將stack中尾部的元素彈出
stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}

?


queue的介紹和使用

queue的介紹

?

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

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

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

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

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

queue的使用

函數名稱函數作用
queue()構造空的隊列
empty()檢測隊列是否為空,是返回true,否則返回false
size()返回隊列中有效元素的個數
front()返回隊頭元素的引用
back()返回隊尾元素的引用
push()在隊尾將元素val入隊列
pop()將隊頭元素出隊列
	queue<int> qu;qu.push(1);qu.push(2);qu.push(3);qu.push(4);qu.push(5);cout << qu.size() << endl;while (!qu.empty()){cout << qu.front() << " ";qu.pop();}

?


容器適配器

什么是適配器

適配器是一種設計模式(設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結),該種模式是將一個類的接口轉換成客戶希望的另外一個接口。

STL中stack和queue的底層結構

雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stack和隊列只是對其他容器的接口進行了包裝,STL中stack和queue默認使用deque。

deque的介紹

deque(雙端隊列):是一種雙開口的"連續"空間的數據結構,雙開口的含義是:

可以在頭尾兩端進行插入和刪除操作,且時間復雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高。?

deque不是真正連續的空間,而是由一段段連續的小空間拼接而成的,實際deque類似于一個動態的二維數組,?其底層結構如下圖所示:

雙端隊列底層是一段假象的連續空間,實際是分段連續的,為了維護其“整體連續”以及隨機訪問的假象,落在了deque的迭代器身上,因此deque的迭代器設計就比較復雜,如下圖所示:?

?

deque的缺陷

  • 與vector比較,deque的優勢是:

頭部插入和刪除時,不需要搬移元素,效率特別高,而且在擴容時,也不需要搬移大量的元素,因此其效率是必vector高的。

  • 與list比較,其底層是連續空間,空間利用率比較高,不需要存儲額外字段。
  • 但是,deque有一個致命缺陷

不適合遍歷,因為在遍歷時,deque的迭代器要頻繁的去檢測其是否移動到某段小空間的邊界,導致效率低下,而序列式場景中,可能需要經常遍歷,因此在實際中,需要線性結構時,大多數情況下優先考慮vector和list,deque的應用并不多,而目前能看到的一個應用就是,STL用其作為stack和queue的底層數據結構。

為什么選擇deque作為stack和queue的底層默認容器?

stack是一種后進先出的特殊線性數據結構,因此只要具有push_back()和pop_back()操作的線性結構,都可以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數據結構,只要具有push_back和pop_front操作的線性結構,都可以作為queue的底層容器,比如list。但是STL中對stack和queue默認選擇deque作為其底層容器,主要是因為:

1. stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進行操作。

2. 在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數據);queue中的元素增長時,deque不僅效率高,而且內存使用率高。

結合了deque的優點,而完美的避開了其缺陷。


stack的模擬實現

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

容器適配器默認缺省為deque,但是對于stack的特點:尾插尾刪;使用vector和list都可以。


queue的模擬實現

template<class T ,class Container=deque<T>>class Queue{public:void push(const T& x){_con.push_back(x);}T& front(){return _con.front();}void pop(){_con.pop_front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;

queue和stack的默認缺省適配器也是deque,但是對于queue的特點:頭刪尾插;適配器可以使用list,不可以使用vector因為對于vector來說頭刪需要移動數據,不是很方便。


今天對適配器以及stack和queue的介紹、使用、模擬實現的分享到這就結束了,希望大家讀完后有很大的收獲,也可以在評論區點評文章中的內容和分享自己的看法。您三連的支持就是我前進的動力,感謝大家的支持!!?!

?

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

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

相關文章

Doris擴容和縮容(六)

Doris 可以很方便的擴容和縮容 FE、BE、Broker 實例。 FE 擴容和縮容 可以通過將 FE 擴容至 3 個以上節點來實現 FE 的高可用。 1&#xff09;使用 MySQL 登錄客戶端后&#xff0c;可以使用 sql 命令查看 FE 狀態&#xff0c;目前就一臺 FE mysql -h hadoop1 -P 9030 -uroo…

Python——基于YOLOV8的車牌識別(源碼+教程)

目錄 一、前言 二 、完成效果 三、 項目包 四、運行項目 &#xff08;教程&#xff09; 一、前言 YOLOv8LPRNet車牌定位與識別https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一個車牌識別的小需求&#xff0c;今天完成了&#xff0c;在此記錄和分享 首先&#x…

辦公技巧:Word中插入圖片、形狀、文本框排版技巧

目錄 一、插入圖片排版技巧 二、添加形狀排版技巧 三、插入“文本框”排版技巧 我們平常在制作word時候經常會遇到插入選項卡下的圖片、形狀和文本框這三種情況下&#xff0c;那么如何使得Word文檔當中添加這三個元素的同時&#xff0c;又能保證樣式美觀呢&#xff0c;今天小…

ComfyUI搭建使用教程

ComfyUI 是一個基于節點流程式的stable diffusion AI 繪圖工具WebUI&#xff0c; 你可以把它想象成集成了stable diffusion功能的substance designer&#xff0c; 通過將stable diffusion的流程拆分成節點&#xff0c;實現了更加精準的工作流定制和完善的可復現性。但節點式的工…

【分布式】分布式事務及其解決方案

目錄 一、分布式事務二、分布式事務的解決方案1. 全局事務&#xff08;1&#xff09;DTP模型&#xff08;2&#xff09; 兩階段提交協議&#xff08;2PC&#xff09;原理二階段提交的缺點 &#xff08;3&#xff09;三階段提交協議&#xff08;3PC&#xff09;原理 2. 基于可靠…

【算法】搭配購買(01背包,加權并查集)

題目 Joe覺得云朵很美&#xff0c;決定去山上的商店買一些云朵。 商店里有 n 朵云&#xff0c;云朵被編號為 1,2,…,n&#xff0c;并且每朵云都有一個價值。 但是商店老板跟他說&#xff0c;一些云朵要搭配來買才好&#xff0c;所以買一朵云則與這朵云有搭配的云都要買。 …

DDoS攻擊和CC攻擊有什么不同之處?

DDoS是針對服務器IP發起&#xff0c;CC攻擊針對的是業務端口。DDoS攻擊打的是網站的服務器&#xff0c;而CC攻擊是針對網站的頁面攻擊&#xff0c;用術語來說就是&#xff0c;一個是WEB網絡層拒絕服務攻擊&#xff08;DDoS&#xff09;&#xff0c;一個是WEB應用層拒絕服務攻擊…

Linux添加環境變量$PATH

變量$PATH 查看環境變量 [rootlocalhost lnserver]# echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin由于沒有docker路徑的環境變量&#xff0c;docker命令使用無效 要將腳本添加到 PATH 中&#xff0c;以便無論在哪個目錄中都可以調用它或執行它&…

【鏈路追蹤】xxl-job定時任務日志增加traceId

問題背景 項目中通過sleuth實現了統一的traceId注入&#xff0c;在生產環境進行日志追溯時比較方便。但是在使用xxl-job進行定時任務管理時&#xff0c;卻發現xxl-job線程打印出來的日志沒有traceId&#xff0c;查詢日志時十分不方便&#xff0c;于是通過使用Spring aop的方式…

點云從入門到精通技術詳解100篇-基于深度學習的稀疏點云障礙物檢測

目錄 前言 國內外研究現狀 激光雷達點云配準 激光雷達目標檢測

c#代碼Linq中使用OrderBy進行自定義排序

c#代碼Linq中使用OrderBy進行自定義排序 /// <summary>/// 自定義字符串比較器 用于自定義排序/// </summary>public class StringComparer : IComparer<string>{/// <summary>/// 偏好的排序列表/// </summary>public List<string> _pre…

RK3568基于openharmony3.2版本之MIPI屏幕調試

mipi調試過程 1、前言2、開發環境3、調試過程3.1、下載openharmony3.2源碼3.2、設備樹上增加mipi-dsi屏幕的節點3.3、 分析kernel顯示不出來畫面3.4、 mipi屏幕顯示效果圖1、前言 由于工作需要,RK3568需要支持openharmony3.2系統版本,需要重新移植下載源碼并且適配自家公司的…

【JavaWeb】HTMLCSSJavaScript

HTML&CSS&JavaScript 文章目錄 HTML&CSS&JavaScript一、開發工具及在線幫助文檔二、 HTML2.1 HTML&CSS&JavaScript的作用2.2 HTML基礎結構2.3 HTML概念詞匯解釋2.4 HTML的語法規則2.5 常用標簽 三、CSS3.1 引入方式3.2 CSS選擇器3.3 CSS浮動3.4 CSS定位…

MindSpore基礎教程:LeNet-5 神經網絡在MindSpore中的實現與訓練

MindSpore基礎教程&#xff1a;LeNet-5 神經網絡在MindSpore中的實現與訓練 官方文檔教程使用已經棄用的MindVision模塊&#xff0c;本文是對官方文檔的更新 深度學習在圖像識別領域取得了顯著的成功&#xff0c;LeNet-5 作為卷積神經網絡的經典之作&#xff0c;在諸多研究和應…

Linux | 從虛擬地址到物理地址

前言 本章主要講解虛擬地址是怎么轉化成物理地址的&#xff0c;以及頁表相關知識&#xff1b;本文環境默認為32位機器下&#xff1b;如果你連什么是虛擬地址都不知道可以先看看下面這篇文章&#xff1b; Linux | 進程地址空間-CSDN博客 一、概念補充 頁表&#xff1a;是一種數據…

【性能優化】CPU利用率飆高與內存飆高問題

&#x1f4eb;作者簡介&#xff1a;小明java問道之路&#xff0c;2022年度博客之星全國TOP3&#xff0c;專注于后端、中間件、計算機底層、架構設計演進與穩定性建設優化&#xff0c;文章內容兼具廣度、深度、大廠技術方案&#xff0c;對待技術喜歡推理加驗證&#xff0c;就職于…

2023APMCM亞太杯數學建模選題建議及初步思路

大家好呀&#xff0c;亞太杯數學建模開始了&#xff0c;來說一下初步的選題建議吧&#xff1a; 首先定下主基調&#xff0c;本次亞太杯推薦選擇B題。 C題如果想做好&#xff0c;搜集數據難度并不低&#xff0c;并且模型比較簡單&#xff0c;此外目前選擇的人數過多&#xff0c…

java項目之消防物資存儲系統(ssm+vue)

項目簡介 消防物資存儲系統實現了以下功能&#xff1a; 管理員功能: 管理員登陸后&#xff0c;主要模塊包括首頁&#xff0c;個人中心&#xff0c;用戶管理&#xff0c;倉庫管理&#xff0c;物資入庫管理&#xff0c;物資出庫管理&#xff0c;倉庫管理&#xff0c;物資詳情管…

23年下半年軟考成績查詢時間是什么時候?

一、成績查詢時間 2023年下半年軟考成績查詢時間預計2023年12月份公布&#xff0c;成績查詢入口為計算機技術職業資格網&#xff08;全國統一成績查詢時間&#xff0c;統一查詢入口&#xff09;。 二、成績查詢方法 登陸中國計算機技術職業資格網&#xff0c;點擊“成績查詢”…

7-9 jmu-python-班級人員信息統計

7-9 jmu-python-班級人員信息統計 分數 15 作者 鄭如濱 單位 集美大學 輸入a,b班的名單&#xff0c;并進行如下統計。 輸入格式: 第1行:&#xff1a;a班名單&#xff0c;一串字符串&#xff0c;每個字符代表一個學生&#xff0c;無空格&#xff0c;可能有重復字符。 第2行:&am…