STL之stackqueue

stack的介紹(可以想象成棧)

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

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

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

empty() /? back? / push_back / pop_back

4.標準容器vector/list/deque均符合這些需求,默認情況下,如果沒有stack指定特定的底層容器,就使用deque(等會會介紹)

stack的使用

它是一個適配器,就是通過別的容器轉換過來的,只是提供一些特定的接口,讓其具有棧的特性

特性:LIFO(last-in first-out,后進先出)

?

可以看到默認使用的模板容器類是deque

?

constructor

stack<int> s;//構造一個空的對象

如果你想指定你的stack使用的底層容器可以stack<int,vector<int>> s;

三種構造方式:1.構造空的stack對象

? ? ? ? ? ? ? ? ? ? ? ? ?2.使用一個模板容器構造,例如你已經構造vector v1對象了,傳參可以傳v1

? ? ? ? ? ? ? ? ? ? ? ? ?3.拷貝構造函數,傳一個stack對象

其他重要函數接口

empty():判斷是否為空

size():返回棧的元素的個數(返回棧的大小)

top():取棧頂的元素

push():將元素val壓入stack中

pop():將棧頂的元素val刪除

swap():交換兩個棧

總結

1.棧是沒有迭代器的,因為棧的特性是先進后出,不能隨便訪問,所以不支持迭代器

2.如何遍歷?先判斷為不為空,不為就取棧頂的數據,取完之后pop就行

3.為什么沒有析構函數?因為它底層是別的容器,當stack出了作用域自動銷毀時會調底層容器的析構函數

queue的介紹(想象成隊列):

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

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

3.底層容器可以是標準容器類模板之一,也可以是其他專門設計的容器類,該底層容器至少要滿足以下操作

empty/? ?size? /? front / back /push_back /? pop_front

4.deque/list都滿足這些要求,如果沒有指定,默認使用deque

queue的使用

隊列就是一種容器適配器,是基于一些容器實現的特定的接口以滿足先進先出的特性

默認使用deque容器?

幾乎和棧沒差別,構造函數,還有一些其他函數接口也幾乎一樣

區別在于,stack使用top取棧頂數據

queue可以取隊頭也可以取隊尾的數據?

front隊頭,back隊尾,top棧頂

而且注意這些都是返回引用,也就是你可以修改

總結:

隊列也沒有實現迭代器,因為不能支持隨機訪問,否則就保持不了隊列的先進先出的特性

deque的介紹

deque:雙端隊列,與queue沒關系,不要聯想到一起,它是一種容器,沒有隊列先進先出的特性

STL標準庫中stack和queue的底層結構:

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

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

duque的使用?

?可以看到它支持頭插尾插頭刪尾刪?

?可以看到支持迭代器

支持隨機訪問?

關于deque的使用可以去官網看詳細解釋,這里只要學明白為什么stack和queue底層用deque

deque的原理

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

簡單來說,deque底層是由一系列固定大小的連續存儲塊組成,這些存儲塊叫緩沖區(buffer)

此外,還有一個中控器(通常是一個數組map)存儲著指向buffer的指針來管理緩沖區

那它怎么支持隨機訪問???,這就落在了deque的迭代器身上了,簡單來說就是用中控器中的結點,然后用來構造迭代器類型,迭代器里面又有cur first last node等管理,每遍歷一個點,cur就往后走,直到last它就遍歷結束這一塊buffer,遍歷完之后node就++就走到下一個結點,然后依次循環下去就是連續遍歷

deque的缺陷

與vector相比,deque的優勢是:頭部插入和刪除時,不需要搬移元素,(我們只要在前面多加一個結點,這個結點新開一些buffer,就能解決頭插,頭刪時只要指針指向的位置變就可以)效率特別高,而且在擴容時,也不需要搬移大量的元素,因此其效率是比vector高的,這些可以歸結與一個原因,就是vector是連續的物理空間,deque不是連續的,它是通過一個中控器去管理,連續的不夠大了就需要重新找一塊連續的,而deque不需要

與list相比,deque底層是類似連續的空間,空間利用率高,不需要存儲額外的字段,你list每個結點還要存前一個結點和后一個結點的指針

但是deque有一個致命缺陷:不適合遍歷,在遍歷時,deque的迭代器要頻繁的檢查是否移動到某段buffer的邊界,導致效率低下,而序列式場景中,可能需要經常的遍歷,因此在實際中,需要線性結構時,大多數情況下優先考慮vector和list,這也就是為什么我們沒有重點學習deque的接口原因,deque的應用并不多,目前我們能看到的就是stack和queue底層使用deque

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

1.stack和queue不需要遍歷(因此其沒有迭代器),只需要在固定的一端或者兩端進行操作,那deque遍歷效率低就在stack和queue這沒啥影響了

2.在stack中元素增長時,deque比vector效率高(擴容時不需要搬移大量數據),queue中的元素增長時,deque不僅效率高,而且內存使用率也高,也就是無論頭插還是尾插,頭刪還是尾刪,deque的效率也不比list和vector低多少,綜合而言,結合了deque的優點,避開了其缺陷

stack和list的模擬實現:

June: 這里包含我的c++和Linux及數據結構https://gitee.com/taifanshu/day2.git已經上傳gitee,有需要可以自行拿取,代碼有問題可以私聊問

?

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

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

相關文章

【現代深度學習技術】現代循環神經網絡06:編碼器-解碼器架構

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上&#xff0c;結合當代大數據和大算力的發展而發展出來的。深度學習最重…

宏電全新升級單北斗5G電力DTU,為每一公里電力線路注入可靠連接

在配網自動化改造與數字化轉型的雙重驅動下&#xff0c;宏電股份推出全新升級版H7710-DLWZ系列5G電力DTU&#xff0c;聚焦配網通信鏈路冗余、國產自主可控、復雜環境適應性三大核心需求&#xff0c;為配電自動化、臺區智能運維、分布式能源接入等場景提供高可靠通信底座。 國產…

學習海康VisionMaster之間距檢測

一&#xff1a;進一步學習了 今天學習下VisionMaster中的間距檢測工具&#xff1a;主要類似于卡尺工具&#xff0c;測量物體的長度或者寬度或者間距 二&#xff1a;開始學習 1&#xff1a;什么是間距檢測&#xff1f; 間距測量模塊用于檢測兩特征邊緣之間的間距&#xff0c;首…

藍橋杯 18. 積木

積木 原題目鏈接 題目描述 小明用積木搭了一個城堡。為了方便&#xff0c;小明使用的是大小相同的正方體積木&#xff0c;并將其搭建在一個 n 行 m 列的方格圖上。每個積木占據方格圖中的一個小格子。 小明的城堡是立體的&#xff0c;可以將積木壘在其他積木上。當某個格子…

C++負載均衡遠程調用學習之基礎TCP服務

目錄 1.LARS課程模塊介紹 2.LARS的功能演示機場景作用 3.LARS的reactor框架的組成部分 4.Lars_reactor的項目目錄構建 5.Lars_tcp_server的基礎服務開發 6.Lars_tcp_server的accept實現 7.LarsV0.1總結 1.LARS課程模塊介紹 2.LARS的功能演示機場景作用 # Lars系統開發 …

EasyExcel使用總結

EasyExcel 文章目錄 EasyExcel1、導入1.1、基本方式導入1.導入依賴2. 加載源文件基本語法 3. 讀取數據行4. 讀取結果 1.2、模型映射導入1.定義實體映射類2. 操作讀取基本語法 3. 讀取數據行4. 讀取結果 1.3、導入類型轉換器語法 1.4、導入監聽器基本語法&#xff1a; 1.5、多行…

【愚公系列】《Manus極簡入門》022-藝術創作顧問:“藝術靈感使者”

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

藍橋杯15屆國賽 最小字符串

問題描述 給定一個長度為 N 且只包含小寫字母的字符串 S&#xff0c;和 M 個小寫字母 c1,c2,...,cM?。現在你要把 M 個小寫字母全部插入到字符串 S 中&#xff0c;每個小寫字母都可以插入到任意位置。請問能得到的字典序最小的字符串是什么&#xff1f; 輸入格式 第一行包含…

【東楓科技】代理英偉達產品:DPU

NVIDIA BlueField-3 DPU 400Gb/s 基礎設施計算平臺 NVIDIA BlueField -3 數據處理單元 (DPU) 是第三代基礎設施計算平臺&#xff0c;使企業能夠構建從云端到核心數據中心再到邊緣的軟件定義、硬件加速的 IT 基礎設施。借助 400Gb/s 以太網或 NDR 400Gb/s InfiniBand 網絡連接…

依圖科技C++后端開發面試題及參考答案

請介紹你所了解的分布式系統 分布式系統是由多個獨立的計算節點通過網絡連接組成的系統&#xff0c;這些節點共同協作以完成特定的任務。分布式系統的設計目標在于提升系統的性能、可擴展性、可靠性和容錯性。 從性能方面來看&#xff0c;分布式系統能夠把任務分配到多個節點…

Python cv2濾波與模糊處理:從原理到實戰

在圖像處理領域&#xff0c;濾波與模糊是預處理階段的兩大核心操作&#xff0c;既能消除噪聲干擾&#xff0c;又能實現藝術化效果。本文將結合OpenCV的cv2庫&#xff0c;系統講解濾波與模糊的原理及Python實現&#xff0c;帶你從理論到實戰全面掌握這項技術。 一、濾波與模糊的…

在 Laravel 12 中實現 WebSocket 通信時進行身份驗證

在 Laravel 12 中實現 WebSocket 通信時&#xff0c;若需在身份驗證失敗后主動斷開客戶端連接&#xff0c;需結合 頻道認證機制 和 服務端主動斷連操作。以下是具體實現步驟&#xff1a; 一、身份驗證流程設計 WebSocket 連接的身份驗證通常通過 私有頻道&#xff08;Private …

FPGA----基于ZYNQ 7020實現petalinux并運行一個程序

引言&#xff1a;上一節我們講到了使用Alinx 7020b自帶的sd卡中的petalinux進行epics的編譯&#xff0c;但此種方案個性化程度不足。如&#xff1a;我們項目需要FPGA側的配合&#xff0c;那么我們需要重新編譯petalinx。 注意&#xff1a;本文的知識點來自下面兩篇文章&#x…

Spring Web MVC————入門(1)

今天開始正式帶大家學習Spring部分的內容了&#xff0c;大家嘗試去弄個專業版嗷&#xff0c;學習起來爽一點 在idea中下載這個插件就行了 我們之后開始創建Spring項目&#xff0c; 藍色 部分自己起名&#xff0c;type選Maven&#xff0c;其他的默認就好了&#xff0c;之后nex…

Vue3 中用 canvas 封裝抽獎轉盤組件:設定中獎概率及獎項圖標和名稱

在 Web 應用開發中&#xff0c;抽獎功能是提升用戶參與度的常用手段。使用 Vue3 結合 canvas 技術&#xff0c;我們可以輕松實現一個高度自定義的抽獎轉盤組件&#xff0c;不僅能設定中獎概率&#xff0c;還能靈活配置獎項圖標和名稱。本文將詳細介紹該組件的實現原理、步驟&am…

Linux 硬盤和光驅系統管理

一、硬盤與目錄的容量 [rootwww ~]# df [-ahikHTm] [目錄或檔名] 選項與參數&#xff1a; -a &#xff1a;列出所有的檔案系統&#xff0c;包括系統特有的 /proc 等檔案系統&#xff1b; -k &#xff1a;以 KBytes 的容量顯示各檔案系統&#xff1b; -m &#xff1a;以 MByt…

2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用戶&#xff1a;優先使用Caffeine&#xff0c;性能更優且維護活躍。 1. 添加依賴 在pom.xml中添加Guava依賴&#xff1a; <dependency><groupId>com.google.guava</groupId&…

黑馬點評day02(緩存)

2、商戶查詢緩存 2.1 什么是緩存? 前言:什么是緩存? 就像自行車,越野車的避震器 舉個例子:越野車,山地自行車,都擁有"避震器",防止車體加速后因慣性,在酷似"U"字母的地形上飛躍,硬著陸導致的損害,像個彈簧一樣; 同樣,實際開發中,系統也需要"避震…

頭歌禁止復制怎么解除(簡單版)

被頭歌數據庫作業禁止復制整神之后&#xff0c;主啵嘗試網上各種解除方法&#xff0c;最后發現一個最簡單且最快速的解除方法。 在瀏覽器中搜索萬能復制插件 下載完成之后就可以隨便復制粘貼啦 超簡單 下載只需幾秒

【無基礎】小白解決Docker pull時報錯:https://registry-1.docker.io/v2/

Docker Compose 啟動失敗問題解決方案 錯誤描述 執行 docker compose up -d 時出現以下錯誤&#xff1a; [] Running 9/9? api Error context canceled …