C++STL——stack,queue

stack與queue

  • 前言
  • 容器適配器
  • deque

前言

本篇主要講解stack與queue的底層,但并不會進行實現,stack的接口
queue的接口 ,關于stack與queue的接口在這里不做講解,因為通過前面的對STL的學習,這些接口都是大同小異的。

容器適配器

在這里插入圖片描述
我們可以發現,stack與queue的第二個參數都是deque。并且在STL里,stack與queue都沒有被分配到容器那一分類,,而是容器適配器中。
在這里插入圖片描述
容器適配器是一種設計模式,該種模式是將一個類的接口轉換成客戶希望的另外一個接口。即我們的stack與queue是對deque的接口進行了包裝而已。我們在前期學習數據結構的時候,stack與queue可以通過數組和鏈表進行實現,那么對應到C++里面,是可以通過vector與list進行實現的,那么為什么默認使用deque進行實現呢?

deque

deque其命為雙端隊列,即可以在兩端進行插入刪除切時間復雜度為O(1),那既然有deque,那么其是否可以取代vector與list呢?當然不行。
先進行補充CPU緩存區的概念:CPU要訪問內存中的數據,需要看這個數據是否在緩沖區中,在的話就叫緩存命中,如果沒有命中那么就需要先加載到緩存再進行訪問緩存。讀取數據根據局部性原理(如果一個數據被訪問,那么它附近的數據也可能很快被訪問。)是不會進行每次只讀一個數據的,內存會先把一部分連續的數據讀入到緩存區中的。

vector的優點:
1.vector支持隨機訪問。
2.CPU高速緩存命中率高。因為vector的數據地址是連續的,所以其連續的數據會在緩存區中,所以其高速緩存命中率高
vector的缺點:
1.頭部與中部插入與刪除數據效率低,因為要挪動數據。
2.擴容后會存在空間浪費的問題
list的優點:
1.任意位置支持O(1)的時間插入刪除
2.不存在擴容,也就不會有浪費空間的問題
list的缺點:
1.不支持下標隨機訪問
2.CPU高速緩存命中率低,因為其內存地址是碎片的。

那么我們的deque是同時兼具兩者的優點的,即支持隨機訪問,CPU高速緩存命中率高,頭插的效率高,也沒有擴容的問題與list相比其空間利用率也更高。但是deque在vector與list的優點上是比不過的,例如vector的隨機訪問的效率是比deque快的。
但是deque的致命缺陷就是其遍歷非常困難,因為在遍歷時,deque的迭代器要頻繁的去檢測其是否移動到某段小空間的邊界,導致效率低下,而序列式場景中,可能需要經常遍歷,因此在實際中,需要線性結構時,大多數情況下優先考慮vector和list,deque的應用并不多,而目前能看到的一個應用就是,STL用其作為stack和queue的底層數據結構。
stack是一種后進先出的特殊線性數據結構,因此只要具有push_back()和pop_back()操作的線性結構,都可以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數據結構,只要具有push_back和pop_front操作的線性結構,都可以作為queue的底層容器,比如list。

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

  1. stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進行操作。
  2. 在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數據);queue中的元素增長時,deque不僅效率高,而且內存使用率高

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

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

相關文章

STM32智能手表:基于FreeRTOS

引言 隨著物聯網和可穿戴設備的快速發展,智能手表作為典型代表,集成了傳感器數據采集、實時顯示、無線通信等多項功能。本文將深入剖析一個基于STM32和FreeRTOS的智能手表項目,從硬件架構到軟件設計,逐步講解如何構建一個完整的嵌…

leetcode504.七進制數

標簽:進制轉換 機試真題 給定一個整數 num,將其轉化為 7 進制,并以字符串形式輸出。 示例 1: 輸入: num 100 輸出: "202" 示例 2: 輸入: num -7 輸出: "-10" 思路:求n進制就是循環取余數,…

中國古代史2

夏朝(公元前2070-公元前1600年) 1.禹建立了我國歷史上第一個奴隸制國家–夏朝,定都陽城。禹傳啟,世襲制代替禪讓制。 2.夏代都城:二里頭遺址位于今河南洛陽偃師二里頭村。發現了大型綠松石龍形器,被命名為…

死鎖的形成

死鎖的形成 背景學習資源死鎖的本質 背景 面試可能會被問到. 學習資源 一個案例: https://www.bilibili.com/video/BV1pz421Y7kM 死鎖的本質 互相持有對方的資源. 存在資源競爭都沒有釋放. 可能出現死鎖. insert into demo_user (no, name) values (6, ‘test1’) on dupl…

MapReduce架構-打包運行

(一)maven打包 MapReduce是一個分布式運算程序的編程框架,是用戶開發“基于Hadoop的數據分析應用”的核心框架。 MapReduce核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序(例如:jar…

C++發起Https連接請求

需要下載安裝openssl //stdafx.h #pragma once #include<iostream> #include <openssl/ssl.h> #include <openssl/err.h> #include <iostream> #include <string>#pragma comment(lib, "libssl.lib") #pragma comment(lib, "lib…

ADI ADRV902x的射頻模擬信號輸入輸出端口的巴倫匹配

根據規格書可知ADRV902x系列的&#xff1a; 【1】輸入阻抗是100Ω差分&#xff0c;包括RX端口和ORX端口。 【2】輸出阻抗是50Ω差分&#xff0c;包括TX端口。 而射頻系統通常采用50Ω的單端走線&#xff0c;所以需要通過正確規格的巴倫完成差分轉單端/單端轉差分的處理。 巴…

【計算機視覺】OpenCV實戰項目:Athlete-Pose-Detection 運動員姿態檢測系統:基于OpenCV的實時運動分析技術

運動員姿態檢測系統&#xff1a;基于OpenCV的實時運動分析技術 1. 項目概述1.1 技術背景1.2 項目特點 2. 技術架構與算法原理2.1 系統架構2.2 核心算法2.3 模型選擇 3. 項目部署與運行指南3.1 環境準備硬件要求軟件依賴 3.2 項目配置3.3 運行項目基本運行模式高級參數 4. 常見問…

linux perf top分析系統性能

1,看到內核宏是否支持perf功能 perf top -g 查看linux 內核宏定義 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 確保幀指針支持以捕獲完整堆棧 2,使用perf top -g 報錯 Access to performance monitoring and observability operations is l…

gin + es 實踐 08

自動擴縮容 本文檔詳細介紹如何在Kubernetes環境中實現Go-ES應用的自動擴縮容&#xff0c;包括水平Pod自動擴縮容(HPA)、垂直Pod自動擴縮容(VPA)和集群自動擴縮容。 1. 自動擴縮容概述 自動擴縮容是指根據負載變化自動調整計算資源的過程&#xff0c;主要目標是&#xff1a;…

【比賽真題解析】混合可樂

這次給大家分享一道比賽題:混合可樂。 洛谷鏈接:U561549 混合可樂 【題目描述】 Jimmy 最近沉迷于可樂中無法自拔。 為了調配出他心目中最完美的可樂,Jimmy買來了三瓶不同品牌的可樂,然后立馬喝掉了一些(他實在是忍不住了),所以 第一瓶可口可樂最大容量為 a 升,剩余 …

AI Coding的發展之路:從概念到改變世界的旅程

AI Coding的發展之路:從概念到改變世界的旅程 引言:當代碼開始自己寫代碼 還記得第一次接觸編程時的手足無措嗎?那些復雜的語法規則、難以捉摸的邏輯錯誤,讓多少人在深夜對著屏幕抓狂。而今天,一個全新的時代正在來臨——AI開始幫我們寫代碼了。這不是科幻電影,而是正在…

基于DQN的自動駕駛小車繞圈任務

1.任務介紹 任務來源: DQN: Deep Q Learning &#xff5c;自動駕駛入門&#xff08;&#xff1f;&#xff09; &#xff5c;算法與實現 任務原始代碼: self-driving car 最終效果&#xff1a; 以下所有內容&#xff0c;都是對上面DQN代碼的改進&#…

Spring 必會之微服務篇(2)

經過上一篇文章的介紹,應該對微服務有了基本的認識,以及為什么要用微服務和微服務要面臨的挑戰和對應的解決問題,這一期繼續聊聊關于微服務的相關知識。 服務拆分 為什么拆 對于大多數的小型項目來說,一般是先采用單體架構,但是隨著后面的用戶規模變大,業務越來越復雜…

word換行符和段落標記

換行符&#xff1a;只換行不分段 作用&#xff1a;我們需要對它進行分段&#xff0c;但它是一個信息群組&#xff0c;我希望它們有同樣的段落格式&#xff01; 快捷鍵&#xff1a;shiftenter 段落標記&#xff1a;分段 快捷鍵&#xff1a;enter 修改字體格式或段落格式 …

JSON|cJSON 介紹以及具體項目編寫

一、JSON介紹 JSON&#xff08;JavaScript Object Notation 即JavaScript對象表示法&#xff09;是一種輕量級的數據交換格式。采用完全獨立于編程語言的文本格式來存儲和表示數據。 JSON是一種數據交換格式.JSON獨立于編程語言(你不必學習JavaScript).JSON表達數據的方式對通…

【LLaMA-Factory】使用LoRa微調訓練DeepSeek-R1-Distill-Qwen-7B

【LLaMA-Factory】使用LoRa微調訓練DeepSeek-R1-Distill-Qwen-7B 本地環境說明禁用開源驅動nouveau安裝nvidia-smi安裝Git環境安裝Anaconda(conda)環境下載DeepSeek-R1-Distill-Qwen-7B模型安裝LLaMA-Factory下載LLaMA-Factory安裝LLaMA-Factory依賴修改環境變量安裝deepspeedA…

初始圖形學(7)

上一章完成了相機類的實現&#xff0c;對之前所學的內容進行了封裝與整理&#xff0c;現在要學習新的內容。 抗鋸齒 我們放大之前渲染的圖片&#xff0c;往往會發現我們渲染的圖像邊緣有尖銳的"階梯"性質。這種階梯狀被稱為"鋸齒"。當真實的相機拍照時&a…

vllm筆記

目錄 vllm簡介vllm解決了哪些問題&#xff1f;1. **瓶頸&#xff1a;KV 緩存內存管理低效**2. **瓶頸&#xff1a;并行采樣和束搜索中的內存冗余**3. **瓶頸&#xff1a;批處理請求中的內存碎片化** 快速開始安裝vllm開始使用離線推理啟動 vLLM 服務器 支持的模型文本語言模型生…

訪問網站提示“不安全”“有風險”怎么辦?

訪問網站提示“不安全”“有風險”有以下幾種解決方案 一、理解警告類型 1.“不安全”提示&#xff08;HTTP網站&#xff09; 原因&#xff1a;網站未使用HTTPS加密&#xff0c;傳輸數據&#xff08;如密碼、支付信息&#xff09;可能被竊取。 表現&#xff1a;瀏覽器地址欄顯…