C++學習第十三天——stack/queue的使用及底層剖析雙端隊列容器適配器

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?少年的旅途應是星辰大海? ? ? ? 🌏?

📃個人主頁:island1314

🔥個人專欄:C++學習

🚀?歡迎關注:👍點贊 👂🏽留言 😍收藏??💞 💞 💞


🚀前言

點擊跳轉到文章【C++學習第十二天——list容器的深度剖析及底層實現】

前面我們已經學習了list容器的相關知識,本文主要介紹STL中另外兩種重要的結構,stack和queue。但是在STL中這兩者并沒有劃分在容器范圍內,而是將其稱為容器適配器。

💥一、容器適配器

1、什么是容器適配器?

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

2、STL標準庫中stack和queue的底層適配?

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

💥二、雙端隊列deque的介紹

1、deque的原理介紹

deque(雙端隊列):是一種雙開口的"連續"空間的數據結構,雙開口的含義是:可以在頭尾兩端進行插入和刪除操作,且時間復雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高。

deque在功能上是vector和list的結合體,如圖:

在這里插入圖片描述

? ? ?deque并不是真正連續的空間,而是由一小段一小段連續的buff小數組和中控數組(指針數組)構成,實際deque類似于一個動態的二維數組,其底層結構如下圖所示:

? ? ? ?小數組滿了之后不擴容,而是再開辟一小段空間做buff,并且開辟buff數組時并不是從中控數組的開頭開始申請的,而是在中間,頭插尾插時才向兩邊申請。

比如:

? ?

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

2、deque的缺陷

? (1)與vector比較,deque的優勢是:頭部插入和刪除時,不需要搬移元素,效率特別高,而且在擴容時,也不需要搬移大量的元素,因此其效率是必vector高的。

??(2)與list比較,其底層是連續空間,空間利用率比較高,不需要存儲額外字段。

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

3、為什么選擇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和queue的使用和模擬實現

1、stack和queue的使用

首先,使用stack和queue需要包含頭文件< satck > 和 < queue >。

stack和queue的主要接口十分簡單:

![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/1f3e5eea1a554861b95acb0fa07fef28.png

在這里插入圖片描述

代碼如下:

#include<stack>
#include<queue>int main()
{	//stack的使用stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;//queue的使用queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;return 0;
}

2、stack的模擬實現

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

3、queue的模擬實現

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

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

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

相關文章

學會python——用python制作一個繪圖板(python實例十九)

目錄 1.認識Python 2.環境與工具 2.1 python環境 2.2 Visual Studio Code編譯 3.制作一個繪圖板 3.1 代碼構思 3.2 代碼實例 3.3 運行結果 4.總結 1.認識Python Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 的設計具有很強的可…

昇思25天學習打卡營第12天| 基于MindNLP+MusicGen生成自己的個性化音樂

之前都是看圖文類的東西&#xff0c;今天體驗一點不一樣的。來點聽力的內容。 mindspore有音樂生成模型MusicGen&#xff0c;MusicGen支持兩種生成模式&#xff1a;貪心&#xff08;greedy&#xff09;和采樣&#xff08;sampling&#xff09;。在實際執行過程中&#xff0c;采…

京東金融大數據分析平臺總體架構:剖析和解讀

京東金融大數據分析平臺總體架構&#xff1a;剖析和解讀 在現代金融行業中&#xff0c;大數據分析已成為決策支持和業務創新的重要工具。京東金融憑借其強大的大數據分析平臺&#xff0c;成功地將海量數據轉化為洞察力&#xff0c;為企業和用戶提供優質服務。本文將深入探討京…

代碼隨想錄訓練營第二十九天 134加油站 135分發糖果 860檸檬水找零 406根據身高重建隊列

第一題&#xff1a; 原題鏈接&#xff1a;134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 需要三個變量&#xff0c;一個變量start記錄結果也就是出發的第一個加油站&#xff0c;一個變量curSum來記錄此時加油耗油后剩余的油量&#xff0c;如果發現c…

微前端的需求有哪些?微前端的原理是怎么樣的?為什么這么設計,及微前端的應用場景是什么?對有些客戶,前端的重要性高于后端

微前端&#xff08;Micro Frontends&#xff09;是將前端應用拆分成多個獨立、可部署的部分&#xff0c;每個部分可以由不同的團隊獨立開發、測試、部署和維護。這種架構類似于微服務在后端的應用&#xff0c;是為了應對復雜前端應用的維護和擴展問題而提出的。 來龍去脈 背景…

【吳恩達機器學習-week2】可選實驗:使用 Scikit-Learn 進行線性回歸

支持我的工作 &#x1f389; &#x1f4c3;親愛的朋友們&#xff0c;感謝你們一直以來對我的關注和支持&#xff01; &#x1f4aa;&#x1f3fb; 為了提供更優質的內容和更有趣的創作&#xff0c;我付出了大量的時間和精力。如果你覺得我的內容對你有幫助或帶來了歡樂&#xf…

庫表設計(基礎)-實體與設計關系

實體關系分析 1 實體關系是指系統事務之間的聯系。 2 實體關系需要雙向分析。 3 實體關系決定表關系。 實體關系的種類 1 一對一 2 一對多 3 多對多 舉例&#xff1a; 上面關系如下&#xff1a; 班級和學生 &#xff1a; 1:N 學生和課程&#xff1a;N : N 學生和學籍檔案&a…

MISRA C 和MISRA C++:汽車軟件安全的守護者

一、MISRA C與C語言 自1972年Dennis MacAlistair Ritchie在美國貝爾實驗室創造C語言以來&#xff0c;它已成為當今最流行的編程語言之一。C語言以其使用的靈活性、功能的豐富性而廣受歡迎&#xff0c;但同時也因其寬松的語法和不嚴格的數據類型給開發的產品帶來了安全隱患。 …

如何批量給文件名添加編號?這個方法速度快!操作簡單!

如何批量給文件名添加編號&#xff1f;這個方法速度快&#xff01;操作簡單&#xff01;批量給文件重命名&#xff0c;這個是在工作中和生活中經常要用到的一個小技巧&#xff0c;許多人還不知道怎么操作&#xff0c;當然如果要按一定的格式和規律重命名大量的文件&#xff0c;…

Linux內核 -- 多核通信之RPMSG驅動使用

Linux Kernel RPMsg 驅動注冊流程的高級用法與注意事項 在Linux Kernel中&#xff0c;RPMsg&#xff08;Remote Processor Messaging&#xff09;是一種用于不同處理器之間通信的機制&#xff0c;通常用于多核系統中的通信&#xff0c;如主處理器和協處理器之間的消息傳遞。了…

巴西電子游戲PWA借助海外快手kwai社交廣告出海趨勢解讀

巴西電子游戲PWA借助海外快手kwai社交廣告出海趨勢解讀 在數字化時代的浪潮中&#xff0c;電子游戲行業蓬勃發展&#xff0c;而廣告投放策略也隨之日新月異。特別是在巴西這樣一個充滿活力的市場&#xff0c;電子游戲的普及與流行程度不容小覷。在這樣的背景下&#xff0c;在數…

java數據結構集合復習之ArrayList與順序表

前言: 這是我最一年學習java的一部分的回顧總結 1.List 1.1什么是List? 在框架集合中,List是一個接口,繼承自Collection。 Collection也是一個接口&#xff0c;該接口中規范了后序容器中常用的一些方法&#xff0c;具體如下所示 --------boolean add(E e)尾插 evoid a…

[pwn]靜態編譯

靜態編譯 1. 棧足夠大的情況下 程序在ida打開后&#xff0c;左側的函數欄目沒有紅色&#xff08;系統調用的函數&#xff09;&#xff0c;而只有一些靜態函數&#xff0c;通常這類文件的大小會必普通的pwn題程序要大得多。 這種靜態編譯的題沒有調用庫函數&#xff0c;也就沒…

百度云智能媒體內容分析一體機(MCA)建設

導讀 &#xff1a;本文主要介紹了百度智能云MCA產品的概念和應用。 媒體信息海量且復雜&#xff0c;采用人工的方式對視頻進行分析處理&#xff0c;面臨著效率低、成本高的困難。于是&#xff0c;MCA應運而生。它基于百度自研的視覺AI、ASR、NLP技術&#xff0c;為用戶提供音視…

Vue 性能革命:揭秘前端優化的終極技巧;Vue優化技巧,解決Vue項目卡頓問題

目錄 Vue優化路徑 一、使用key 二、使用凍結對象 三、使用函數式組件 四、使用計算屬性 五、使用非實時綁定的表單項 六、保持對象引用穩定 6.1、保持對象引用穩定定義 6.2、保持對象引用穩定與不穩定的例子 6.3、vue2判斷數據是否變化是通過hasChanged函數實現的 ①…

2024年【四川省安全員B證】考試及四川省安全員B證考試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【四川省安全員B證】考試及四川省安全員B證考試題&#xff0c;包含四川省安全員B證考試答案和解析及四川省安全員B證考試題練習。安全生產模擬考試一點通結合國家四川省安全員B證考試最新大綱及四川省安全員B證…

golang項目中gorm框架的配置和具體使用

最近在改造golang項目&#xff0c;從postgre數據庫遷移到達夢數據庫&#xff0c;我還想在改造后的項目使用 gorm 操作數據庫&#xff0c;保持較小的改動。查找了不少資料&#xff0c;最終從以下兩篇文章中借鑒了不少 1、Gorm 入門介紹與基本使用 這篇知乎文章詳細介紹了 gorm 框…

C語言 -- 操作符詳解?

C語言 -- 操作符詳解? 1. 操作符的分類2. 二進制和進制轉換?2.1 2進制轉10進制?2.1.1 10進制轉2進制數字? 2.2 2進制轉8進制和16進制?2.2.1 2進制轉8進制?2.2.2 2進制轉16進制? 3. 原碼、反碼、補碼?4. 移位操作符?4.1 左移操作符? 4.2 右移操作符?5. 位操作符&…

Symfony實戰手冊:PHP框架的高級應用技巧

引言 Symfony是一個功能強大且廣泛應用于PHP應用程序開發的框架&#xff0c;它提供了許多高級特性和工具&#xff0c;可以幫助開發人員更高效地構建和管理復雜的Web應用程序。以下是Symfony框架的幾個關鍵方面及其高級應用技巧&#xff1a; 1. 路由和控制器 Symfony的路由組…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分組成&#xff0c; action, header, options action,決定當前規則匹配上后需要執行的動作header,定義當前規則的協議&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定義了具體的規則 一、 action 合法的action值有&#x…