C++之序列容器(vector,list,dueqe)

1.大體對比

在軟件開發的漫長歷程中,數據結構與算法始終占據著核心地位,猶如大廈的基石,穩固支撐著整個程序的運行。在眾多編程語言中,數據的存儲與管理方式各有千秋,而 C++ 憑借其豐富且強大的工具集脫穎而出,尤其是在處理序列數據方面,C++ 標準模板庫(STL)中的序列容器?vectorlist?和?deque?更是展現出卓越的性能與高度的靈活性。

和一些編程語言中單一的數據存儲方式相比,C++ 這三種序列容器的存在,無疑為開發者提供了更多樣化的選擇。例如,在 Python 中,主要通過列表(list)來存儲序列數據,其本質上是一種動態數組,但在處理大規模數據的隨機訪問和頻繁插入刪除操作時,性能表現往往不盡如人意。反觀 C++ 的?vector,它與傳統數組有相似之處,卻具備了自動調整大小的功能,這一特性讓其在面對數據量動態變化的場景時,能夠輕松應對,極大地提升了開發效率。

再將目光投向鏈表結構。在 Java 語言中,雖然沒有像 C++?list?這樣直接對應的雙向鏈表容器,但開發者可以通過自定義類和節點來構建鏈表結構。然而,這種方式不僅實現起來較為繁瑣,而且在進行常見的元素操作,如插入和刪除時,其效率遠不及 C++ 的?list。C++ 的?list?作為雙向鏈表,每個節點都包含指向前一個節點和后一個節點的指針,這種數據結構使得在任意位置進行插入和刪除操作的時間復雜度都保持在常數級別,在需要頻繁修改序列數據的場景中,它的優勢便得以充分彰顯。

deque?則是 C++ 序列容器中的一顆獨特 “新星”,它巧妙地融合了?vector?和?list?的部分優勢。和 Java 中的雙端隊列(ArrayDeque)相比,C++ 的?deque?不僅在兩端進行元素的插入和刪除操作時具有高效性,而且在支持隨機訪問方面也毫不遜色。這意味著,在既需要快速在兩端增減元素,又要對序列中的元素進行隨機訪問的復雜場景下,deque?能夠提供更為平衡和高效的解決方案。

正是基于這些顯著的特性差異,深入了解 C++ 的?vectorlist?和?deque?這三種序列容器,對于每一位追求卓越編程質量的開發者而言,都顯得尤為重要。接下來,讓我們撥開迷霧,詳細剖析這三種序列容器的獨特之處,探尋它們在不同編程場景下的最佳應用方式

?2.數據結構

1.vector(連續)

?2.list(指針)

3.deque

3.成員函數

這個三個人的成員函數是一樣

3.1 創建

vector():默認構造函數,創建一個空的 vector。
vector(size_type n, const T& value = T()):創建一個包含 n 個值為 value 的元素的 vector。
vector(const vector& other):拷貝構造函數,創建一個 other 的副本。
vector(InputIterator first, InputIterator last):使用迭代器 first 到 last 范圍內的元素初始化list():默認構造函數,創建一個空的 vector。
list(size_type n, const T& value = T()):創建一個包含 n 個值為 value 的元素的 vector。
list(const vector& other):拷貝構造函數,創建一個 other 的副本。
list(InputIterator first, InputIterator last):使用迭代器 first 到 last 范圍內的元素初始化 deque():默認構造函數,創建一個空的 vector。
deque(size_type n, const T& value = T()):創建一個包含 n 個值為 value 的元素的 vector。
deque(const vector& other):拷貝構造函數,創建一個 other 的副本。
deque(InputIterator first, InputIterator last):使用迭代器 first 到 last 范圍內的元素初始化 

?3.2 訪問


back()//返回隊列尾部元素的引用。
front()//返回隊列頭部元素的引用。
clear()//清空隊列中的所有元素。
empty()//判斷隊列是否為空。
size()//返回隊列中元素的個數。
begin()//返回頭位置的迭代器
end()//返回尾+1位置的迭代器//vector沒有
rbegin()//返回逆頭位置的迭代器 
rend()//返回逆尾-1位置的迭代器 //list沒有
下標訪問 []

?3.3刪除

pop_back()//刪除隊列尾部的元素。
pop_front()//刪除隊列頭部的元素
erase(iterator pos):移除 pos 位置的元素。
erase(iterator first, iterator last):移除 first 到 last 范圍內的元素。
clear():移除 vector 中的所有元素

3.4插入

push_back(const T& value)
push_front(const T& value)
insert(iterator pos, const T& value)

?4.實現隊列和棧

?棧:一種先進后出的數據結構

隊列:一種先進先出的數據結構

用vector實現棧:

#include<vector>
#include<string>
using namespace std;template<class T> class stack {
private:std::vector<T> data;
public://創建stack();stack(const stack& other):data(other.data){};stack& operator=(const stack& other){data=other.data;return *this;}stack(int n, T val):data(n,val){}//訪問int size()const {return data.size();}bool empty()const{if(data.size()==0)return true;elsereturn false;}T top() const{if(data.empty()==true)throw string("stack is empty");elsereturn data.back();}//插入void push(T val){data.push_back(val);}//刪除void pop(){if(data.empty()==true)throw string("stack is empty");else{data.pop_back();}}~stack();};

5.總結

對比維度std::vectorstd::liststd::deque
底層結構動態數組,在內存中分配連續的存儲空間。當容量不足時,通常會重新分配更大的內存塊,將原數據復制過去并釋放舊內存。雙向鏈表,由一系列節點構成,每個節點包含數據、指向前一個節點的指針和指向后一個節點的指針。由多個固定大小的數組塊組成,每個數組塊內部連續存儲,數組塊之間通過指針連接,形成雙端隊列結構。
訪問操作- 支持隨機訪問,可通過下標直接訪問元素,時間復雜度為?\(O(1)\)。
- 訪問元素非常高效,就像操作普通數組一樣。
- 不支持隨機訪問,若要訪問特定位置元素,需從頭或尾開始遍歷鏈表,時間復雜度為 (O(n))。
- 只能順序訪問元素。
- 支持隨機訪問,通過下標訪問元素的時間復雜度為(O(1))。
- 雖然能隨機訪問,但由于是分段連續存儲,在效率上可能略低于?vector
插入操作?在尾部插入元素效率高,平均時間復雜度為 (O(1)),但若觸發內存重新分配,時間復雜度為 (O(n))。?在中間或頭部插入元素,需要移動插入位置之后的所有元素,時間復雜度為 (O(n))。- 在任意位置插入元素的時間復雜度均為 (O(1)),只需修改相鄰節點的指針。
- 插入操作非常靈活,效率高。
- 在頭部和尾部插入元素效率高,時間復雜度為 (O(1))。
- 在中間插入元素,需要移動部分元素,時間復雜度為 (O(n)),但通常比?vector?移動元素的開銷小。
刪除操作- 在尾部刪除元素效率高,時間復雜度為(O(1))。
- 在中間或頭部刪除元素,需要移動刪除位置之后的所有元素,時間復雜度為 (O(n))。
?在任意位置刪除元素的時間復雜度均為 (O(1)),只需修改相鄰節點的指針。- 在頭部和尾部刪除元素效率高,時間復雜度為?\(O(1)\)。
- 在中間刪除元素,需要移動部分元素,時間復雜度為?\(O(n)\),但通常比?vector?移動元素的開銷小。
空間利用- 由于是連續存儲,可能會有內存碎片問題。當容量不足重新分配內存時,可能會預留一定的額外空間,造成空間浪費。
- 不過,它的空間利用率相對較高,因為沒有額外的指針開銷。
每個節點都需要額外的指針來指向前一個和后一個節點,增加了內存開銷。
- 但鏈表節點在內存中可以不連續存儲,不會因為預留空間而造成浪費。
- 由于需要維護多個數組塊以及塊之間的連接信息,會有一定的額外開銷。
- 不過,它在動態擴展時不需要像?vector?那樣重新分配并復制大量數據,空間管理相對靈活。
迭代器-隨機訪問迭代器,支持?++--+-?等操作,可以像指針一樣靈活地在容器中移動。- 雙向迭代器,支持?++?和?--?操作,能雙向遍歷鏈表,但不支持隨機訪問。- 隨機訪問迭代器,與?vector?的迭代器類似,支持高效的隨機訪問操作。
迭代器失效情況- 當發生插入或刪除操作導致內存重新分配時,所有迭代器、指針和引用都會失效。
- 在插入或刪除元素后,插入或刪除位置之后的迭代器、指針和引用會失效。
- 插入操作不會使任何迭代器、指針和引用失效。
- 刪除操作只會使指向被刪除節點的迭代器、指針和引用失效。
在頭部或尾部插入元素時,迭代器一般不會失效,但指向元素的引用和指針可能會失效。
- 在中間插入或刪除元素時,插入或刪除位置之后的迭代器、指針和引用會失效。
使用場景?適合需要頻繁隨機訪問元素,且插入和刪除操作主要在尾部進行的場景,如存儲一組數據并經常通過下標訪問。
- 實現棧、隊列等數據結構時,若操作主要集中在尾部,vector?是不錯的選擇。
- 適合需要頻繁在任意位置進行插入和刪除操作,而對隨機訪問需求較少的場景,如實現鏈表類的數據結構。
- 當需要頻繁進行元素的移動、插入和刪除,且不需要隨機訪問元素時,list?更合適。
- 適合需要在頭部和尾部頻繁進行插入和刪除操作,同時也需要隨機訪問元素的場景,如實現雙端隊列。
- 當數據量較大,且需要在兩端進行高效操作時,deque?是一個較好的選擇。

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

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

相關文章

【學習筆記】【DeepSeek AI 醫生】2-2 AI家庭醫生課程內容介紹

【DeepSeek AI 醫生】2-4 項目詳細分析及DeepSeek適用場景 一、Ollama部署二、可視化UI三、構建項目環境四、搭建項目架構五、Spring Al六、SSE服務端推送事件七、數據持久化八、線上部署 一、Ollama部署 Mac部署windows 部署ollama腳本、常用命令DeepSeek 提示詞、角色、適用…

STM32 I2C驅動開發全解析:從理論到實戰 | 零基礎入門STM32第五十步

主題內容教學目的/擴展視頻I2C總線電路原理&#xff0c;跳線設置&#xff0c;I2C協議分析。驅動程序與調用。熟悉I2C總線協議&#xff0c;熟練調用。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 引言一、I2C驅動分層架構二、I2C總線驅動代碼精析2.1 初始化配置&a…

Vercel Serverless

1. 引言 現代應用程序是為適應當前技術環境需求而設計的軟件&#xff0c;采用現代開發工具和實踐&#xff0c;針對云部署和可擴展性優化。它們由多個模塊化小組件組成&#xff0c;便于集成和縮放&#xff0c;具有高度的敏捷性和適應性&#xff0c;能快速響應用戶或業務需求變化…

國產操作系統之系統分區及分區的作用

國產操作系統之系統分區及分區的作用和掛載 Linux的系統分區跟Windows有著本質區別,在windows中大家知道c盤一般為系統盤,除c盤系統盤外,我們再分為D、E等文件存儲盤,而在Linux中雖然是以文件目錄著稱的系統,但思路也一樣的,比如針對系統分區中 /home、/var 和 /opt 等文…

字節碼是由什么組成的?

Java字節碼是Java程序編譯后的中間產物&#xff0c;它是一種二進制格式的代碼&#xff0c;可以在Java虛擬機&#xff08;JVM&#xff09;上運行。理解字節碼的組成有助于我們更好地理解Java程序的運行機制。 1. Java字節碼是什么&#xff1f; 定義 Java字節碼是Java源代碼經過…

微前端框架 Qiankun 的應用及問題分析

一、Qiankun 的核心應用場景與優勢 多技術棧共存與靈活集成 Qiankun 支持主應用與子應用使用不同技術棧&#xff08;如 Vue、React、Angular 等&#xff09;&#xff0c;通過 HTML Entry 方式接入子應用&#xff0c;無需深度改造子應用即可實現集成&#xff0c;降低了技術遷移成…

function uuid_generate_v4()不存在(二)

說明&#xff1a;之前代碼里用到了postgresql內嵌函數uid_generate_v4()生成記錄的主鍵&#xff0c;提示該函數不存在&#xff0c;寫了下面這篇博客記錄了一下&#xff0c;今天又發現了新的問題&#xff0c;于是補充了這篇博客。 function uuid_generate_v4()不存在&#xff0…

6. 機器人實現遠程遙控(具身智能機器人套件)

1. 啟動控制腳本 遠程作到 Raspberry Pi 中&#xff0c;并運行以下腳本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登錄筆記本電腦上&#xff0c;同時運行以下腳本&#xff1a; conda ac…

【簡單的C++圍棋游戲開發示例】

C圍棋游戲開發簡單示例&#xff08;控制臺版&#xff09; ?核心代碼實現? #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 簡化棋盤為9x9?:ml-citation{ref"1" data"citationList&…

RK3568平臺(音頻篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系統中用于配置音頻策略和音量的 XML 文件。它定義了音頻流的音量曲線、動態范圍控制(DRC)參數以及音頻設備的音量設置。該文件通常位于 /vendor/etc/ 或 /system/etc/ 目錄下,是 Android 音頻框架的重要組成部分。 以下是對 audi…

如何下載安裝 PyCharm?

李升偉 整理 一、下載 PyCharm 訪問官網 打開 PyCharm 官網&#xff0c;點擊 "Download" 按鈕25。 版本選擇&#xff1a; 社區版&#xff08;Community&#xff09;&#xff1a;免費使用&#xff0c;適合個人學習和基礎開發。 專業版&#xff08;Professional&#…

leetcode day27 455+376

455 分發餅干 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平臺簡介&#xff1a; 主要是官方手冊指南、B站視頻&#xff08;培訓視頻、軟件視頻&#xff09; 1&#xff0c;超算平臺架構&#xff1a; 和普通的家用電腦的架構不同&#xff0c; 主要區別在于&#xff1a;層次化的結構 &#xff08;1&#xff09;超算是有…

K8S單機部署

主線 :部署簡單的單節點k8s - sowler - 博客園 學習網址&#xff1a;為什么我不能獲取到鏡像&#xff0c;ImagePullBackoff | Kuboard docker鏡像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3區塊鏈

Web3 是指下一代互聯網&#xff0c;也被稱為“去中心化互聯網”或“區塊鏈互聯網”。它是基于區塊鏈技術構建的&#xff0c;旨在創建一個更加開放、透明和用戶主導的網絡生態系統。以下是關于 Web3 的一些關鍵點&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…

SQL Server核心知識總結

SQL Server核心知識總結 &#x1f3af; 本文總結了SQL Server核心知識點,每個主題都提供實際可運行的示例代碼。 一、SQL Server基礎精要 1. 數據庫核心操作 -- 1. 創建數據庫&#xff08;核心配置&#xff09; CREATE DATABASE 學生管理系統 ON PRIMARY (NAME 學生管理系統…

android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局&#xff1a;可以靈活地顯示自定義樣式的 Toast。 線程安全&#xff1a;確保在主線程中顯示 Toast&#xff0c;避免崩潰。 避免內存泄漏&#xff1a;使用 ApplicationContext 和取消機制&#xff0c;防止內存泄漏問題。 工具類&#xff1a;作為一個通用的工具…

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…

RocketMQ提供了哪些過濾機制?

前言 本篇文章比較簡單&#xff0c;分別介紹RocketMQ支持幾種過濾機制&#xff0c;其原理和使用。 RocketMQ 提供了多種消息過濾機制&#xff0c;幫根據業務需求高效篩選消息&#xff0c;可以減少不必要的消息傳輸和處理。以下是其核心過濾機制及使用場景&#xff1a; 1. Tag…

Redis數據結構深度解析:從String到Stream的奇幻之旅(一)

Redis系列文章 《半小時掌握Redis核心操作&#xff1a;從零開始的實戰指南》-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;一&#xff09;-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;二&…