C++STL——deque容器詳解

在這里插入圖片描述
縱有疾風起,人生不言棄。本文篇幅較長,如有錯誤請不吝賜教,感謝支持。

💬文章目錄

    • 一.deque容器的基本概念
    • 二.deque容器常用操作
      • ①deque構造函數
      • ②deque元素操作
      • ③deque賦值操作
      • ④deque交換操作
      • ⑤deque大小操作
      • ⑥deque插入和刪除

一.deque容器的基本概念

vector容器是單向開口的連續內存空間,deque(['dek])則是一種雙向開口的連續線性空間。所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,可以理解為數據結構的雙端隊列。當然,vector容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,全部元素都要后移,無法被接受。
在這里插入圖片描述
?deque容器和vector容器的差異:

  • ①deque是雙端隊列,可在容器的頭部和尾部插入或刪除元素。
  • ②deque沒有容量的概念,因為它是動態的以分段連續空間組合而成,隨時可以增加一段新的空間并鏈接起來,換句話說,deque不會像vector那樣,”舊空間不足而重新配置一塊更大空間,然后復制元素,再釋放舊空間”這樣的事情在deque身上是不會發生的。deque可以隨時將空間串接在首部或尾部,也因此,deque沒有必須要提供所謂的空間保留(reserve)功能。

?deque容器內部實現原理:

deque容器在邏輯上是一片連續的空間,但這只是一種假象,實際deque是由一段一段的定量的連續空間構成。一旦有必要在deque前端或者尾端增加新的空間,便配置一段連續定量的空間,串接在deque的頭端或者尾端。deque最大的工作就是維護這些分段連續的內存空間的整體性的假象,并提供隨機存取的接口,避開了(1)重新配置空間申請更大空間 (2)原數據復制新空間 (3)釋放原空間三步驟,代價就是復雜的迭代器架構。

既然deque是分段連續內存空間,那么就必須有中央控制,維持整體連續的假象。deque內部存在中央控制器,記錄與維護每段數據緩沖區(存儲數據的空間)的內存地址,緩沖區中存儲真實數據,保證可從容器的頭部與尾部插入或刪除元素。緩沖區才是deque的存儲空間主體。
在這里插入圖片描述
deque容器的迭代器:
支持隨機訪問的迭代器,可跳躍式訪問容器元素。

二.deque容器常用操作

①deque構造函數

作用:創建deque容器。
注:使用deque容器時,需包含頭文件#include <deque>

函數原型解釋
deque<T> deq T;默認構造形式(顯示實例化)
deque(beg, end);構造函數將[beg, end)區間中的元素拷貝給本身。
deque(n, elem);有參構造函數,使用n個elem元素進行初始化。
deque(const deque &deq);拷貝構造函數,使用已有deque對象初始化新的對象。

實例:deque構造函數

#include <iostream>
using namespace std;
#include <deque>//包含頭文件
void printdeque(const deque<int>& deq)//形參使用const,避免被修改
{	//const_iterator只讀迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> v1 = { 1,2,3 };//采用模板實現類實現(顯示實例化),默認構造函數,deque<int> v2(6, 1);//構造函數將n個elem拷貝給本身。int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };deque<int> v3(arr, arr + sizeof(arr) / sizeof(arr[0]));//將v[begin(), end())區間中的元素拷貝給本身deque<int> v4(v1);//拷貝構造函數,拿另一個vector對象初始化本身printdeque(v1);printdeque(v2);printdeque(v3);printdeque(v4);
}
int main()
{test();return 0;
}

在這里插入圖片描述

②deque元素操作

作用:通過重載賦值運算符operator[]和成員函數at(int index),對deque容器的單個元素進行讀(作為右值)或寫(作為左值)。

函數原型解釋
T &operator[](size_t n);通過[]訪問元素,如果越界,不拋異常,程序直接掛掉
T &at(size_t n);通過at方法獲取下標為n的元素,如果n越界,拋出out_of_range異常
T *data();返回容器中動態數組的首地址。
const T *data() const;返回容器中動態數組的首地址。
T &front();返回第一個元素。
T &back();返回,最后一個元素。

③deque賦值操作

作用:通過重載賦值運算符operator=和成員函數assign(),對deque容器進行賦值。

函數原型解釋
assign(beg, end);拷貝目標deque容器中[begin(), end())區間的元素,對當前deque容器賦值。
assign(n, elem);將n個elem拷貝賦值給本身。
deque&operator=(const deque &deq);重載等號操作符
swap(deq);將deq與本身的元素互換

實例:deque賦值操作

#include <iostream>
using namespace std;
#include <deque>//包含頭文件
void printdeque(const deque<int>& deq)//形參使用const,避免被修改
{	//const_iterator只讀迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}//遍歷printdeque(deq);	//0 1 2 3 4/* 1.重載運算符=賦值 */deque<int> d1;d1 = deq;printdeque(d1);	//0 1 2 3 4/* 2.assign()函數,區間拷貝 */deque<int> d2;d2.assign(deq.begin(), deq.end());printdeque(d2);	//0 1 2 3 4/* 3.assign()函數,n個elem元素賦值 */deque<int> d3;//5個整型元素6d3.assign(5, 6);printdeque(d3);	//6 6 6 6 6
}
int main()
{test();return 0;
}

在這里插入圖片描述

④deque交換操作

💬表格一覽:

函數原型解釋
void swap(deque &deq);把當前容器與deq交換。

實例:deque交換操作

#include <iostream>
using namespace std;
#include <deque>//包含頭文件
void printdeque(const deque<int>& deq)//形參使用const,避免被修改
{	//const_iterator只讀迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}//遍歷printdeque(deq);	//0 1 2 3 4deque<int> d1;d1.swap(deq);//將deq與本身的元素互換printdeque(d1);
}
int main()
{test();return 0;
}

在這里插入圖片描述

⑤deque大小操作

作用:操作deque容器的大小(即元素個數)。

函數原型解釋
bool empty() const;判斷容器是否為空。
size_t size() const;返回容器的實際大小(已使用的空間)。
resize(int num);重新指定容器的長度為num。若容器變長,則以默認值0填充新位置;若容器變短,則容器末尾超出新長度的元素被刪除。
resize(int num, elem);重新指定容器的長度為num。若容器變長,則以指定值elem填充新位置;若容器變短,則容器末尾超出新長度的元素被刪除。

實例:deque大小操作

#include <iostream>
using namespace std;
#include <deque>//包含頭文件
void printdeque(const deque<int>& deq)//形參使用const,避免被修改
{	//const_iterator只讀迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}printdeque(deq);	//0 1 2 3 4//empty():判斷容器是否為空cout << (deq.empty() ? "deq為空" : "deq不為空") << endl;	//deq不為空//size(); :獲取容器的大小,即元素個數。cout << "deq的大小/元素個數:" << deq.size() << endl;	//5//resize(int num);:重新指定容器的長度為num//若容器變長,則以默認值0填充新位置;若容器變短,則容器末尾超出新長度的元素被刪除。deq.resize(10);			//長度變大時,使用默認值0填充printdeque(deq);	//0 1 2 3 4 0 0 0 0 0deq.resize(3);			//長度變小時,容器末尾超出新長度的元素被刪除printdeque(deq);	//0 1 2//resize(int num, elem); :重新指定容器的長度為num。//若容器變長,則以指定值elem填充新位置;若容器變短,則容器末尾超出新長度的元素被刪除。deq.resize(8, 6);		//長度變大時,使用指定值6填充printdeque(deq);	//0 1 2 6 6 6 6 6}
int main()
{test();return 0;
}

在這里插入圖片描述

注:deque容器不存在容量的概念,即不存在capacity()成員函數。可隨時開辟緩沖區存儲數據。

⑥deque插入和刪除

💬表格一覽:

函數原型解釋
iterator insert(iterator pos, const T& ele);在指定位置插入一個元素ele 返回指向插入元素的迭代器。
iterator insert(const_iterator pos, int count,ele);迭代器指向位置pos插入count個元素ele.返回指向插入元素的迭代器。
void push_front(const T& ele);在容器頭部插入一個數據
void push_back(const T& ele);尾部插入元素ele
void pop_front();刪除容器第一個數據
void pop_back();刪除最后一個元素
void clear();清空容器。
iterator erase(const_iterator start, const_iterator end);刪除迭代器從start到end之間的元素,返回下一個有效的迭代器。
iterator erase(const_iterator pos);刪除迭代器指向的元素,返回下一個有效的迭代器。

實例:deque插入和刪除

#include <iostream>
using namespace std;
#include <deque>//包含頭文件
void printdeque(const deque<int>& deq)//形參使用const,避免被修改
{	//const_iterator只讀迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> v;for (int i = 0; i < 5; i++){v.push_back(i + 1);//尾部插入元素}printdeque(v);//1 2 3 4 5v.insert(v.begin() + 1, 2, 100);//在第二個元素插入2個100printdeque(v);//1 100 100 2 3 4 5v.pop_front();//頭部刪除一個元素v.pop_back();//尾部刪除一個元素printdeque(v);//100 100 2 3 4cout << "-------------" << endl;v.erase(v.begin());//刪除第一個元素printdeque(v);//100 2 3 4deque<int>::const_iterator it = v.erase(v.begin() + 1, v.end() - 1);//刪除從第二個元素到倒數第二個元素,返回下一個有效迭代器printdeque(v);//100 4v.insert(it, 66);printdeque(v);//100 66 4v.clear();//清空容器
}
int main()
{test();return 0;
}

在這里插入圖片描述

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

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

相關文章

el-form組件相關的一些基礎使用

el-checkbox 01.description 多選單選框 02.場景舉例 需要對每一條數據展示她的某些狀態是否存在 03.代碼展示 <el-checkbox v-model"query.isAutoAccptncsign" true-label1 false-label0 :disabled"ifReview?true:false">自動發起承兌應答</…

直方圖均衡化和自適應直方圖均衡化

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 均衡化是數字圖像處理中常用的一種技術&#xff0c;用于增強圖像的視覺效果和對比度。&#xff0c;今天我們將實現對同一張圖像的直方圖均衡化和自適應直方圖均衡化處理&#xff0c;學習一下兩者的的基本原理和實現過程&a…

MFC中的窗體繪制事件函數:OnCtlColor、OnPaint、OnNcPaint、OnDrawItem、OnEraseBkgnd、OnDraw

文章目錄 CWnd::OnCtlColorCWnd::OnPaintCWnd::OnNcPaintCWnd::OnDrawItemCWnd::OnEraseBkgndCWnd::InvalidateRectCView::OnDraw 參考&#xff1a;https://learn.microsoft.com/ CWnd::OnCtlColor 即將繪制子控件時&#xff0c;框架會調用此成員函數。 afx_msg HBRUSH OnCt…

React 高階組件(HOC)

React 高階組件(HOC) 高階組件不是 React API 的一部分&#xff0c;而是一種用來復用組件邏輯而衍生出來的一種技術。 什么是高階組件 高階組件就是一個函數&#xff0c;且該函數接受一個組件作為參數&#xff0c;并返回一個新的組件。基本上&#xff0c;這是從 React 的組成…

Mongodb 更新集合的方法到底有幾種 (中) ?

更新方法 Mongodb 使用以下幾種方法來更新文檔 &#xff0c; Mongodb V5.0 使用 mongosh 客戶端&#xff1a; db.collection.updateOne(<filter>, <update>, <options>) db.collection.updateMany(<filter>, <update>, <options>) db.c…

docker 安裝elasticsearch、kibana

下載es鏡像 docker pull elasticsearch 啟動es容器 docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d elasticsearch 驗證es界面訪問 ?????http://節點ip:9200/ ?…

client-go實戰之十二:選主(leader-election)

歡迎訪問我的GitHub 這里分類和匯總了欣宸的全部原創(含配套源碼)&#xff1a;https://github.com/zq2599/blog_demos 本篇概覽 本文是《client-go實戰》系列的第十二篇&#xff0c;又有一個精彩的知識點在本章呈現&#xff1a;選主(leader-election)在解釋什么是選主之前&…

【自用】云服務器 docker 環境下 HomeAssistant 安裝 HACS 教程

一、進入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 連接上云服務器&#xff08;宿主機&#xff09;后&#xff0c;終端內進入 root &#xff0c;輸入&#xff1a; docker ps找到了 docker 的 container ID 2.config HomeAssistant 輸入下面的命令&…

修改el-table行懸停狀態的背景顏色

.content:deep().el-table tr:hover>td {background-color: #f5f5f5 !important; /* 設置懸停時的背景顏色 */ }/*這一點很重要&#xff0c;否則可能會導致hover行時操作列還是原來的背景色*/ .content:deep().el-table__body tr.hover-row>td{background-color: #f5f5f5…

使用Nacos配置中心動態管理Spring Boot應用配置

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

Linux權限系列--給普通用戶添加某個命令的sudo權限

原文網址&#xff1a;Linux權限系列--給普通用戶添加某個命令的sudo權限_IT利刃出鞘的博客-CSDN博客 簡介 說明 本文介紹Linux系統如何給普通用戶添加某個命令的sudo權限。 使用場景 普通開發者可能需要sudo的命令&#xff1a; apt-get&#xff08;經常要安裝軟件&#x…

【Vue2】---->VueX 3 核心概念

官網&#xff1a; Vuex 是什么&#xff1f; | Vuex (vuejs.org) 目錄 介紹 1、安裝 2、新建 store/index.js 專門存放 vuex 3、 在 main.js 中導入掛載到 Vue 實例上 核心概念 1、核心概念 -state 狀態 1、訪問Vuex中的數據 2、通過$store訪問的語法 3、通過輔助函…

Java IO流(一)IO基礎

概述 IO流本質 I/O表示Input/Output,即數據傳輸過程中的輸入/輸出,并且輸入和輸出都是相對于內存來講Java IO(輸入/輸出)流是Java用于處理數據讀取和寫入的關鍵組件常見的I|O介質包括 文件(輸入|輸出)網絡(輸入|輸出)鍵盤(輸出)顯示器(輸出)使用場景 文件拷貝&#xff08;File&…

Python自帶的IDLE有什么用

在Python的官方解釋器中&#xff0c;自帶了一個名為IDLE(Interactive DeveLopment Environment)的集成開發環境。 一、簡化代碼調試過程 很多初學者在編寫Python代碼時&#xff0c;經常會遇到一些問題需要調試。而在IDLE中&#xff0c;我們可以通過設置斷點、單步調試等方法&…

算法競賽入門【碼蹄集新手村600題】(MT1160-1180)C語言

算法競賽入門【碼蹄集新手村600題】(MT1160-1180&#xff09;C語言 目錄MT1161 N的零MT1162 數組最大公約數MT1163 孿生質數MT1164 最大數字MT1165 卡羅爾數MT1166 自守數MT1167自守數IIMT1168 階乘數MT1169 平衡數MT1170 四葉玫瑰數MT1171 幻數MT1172 完美數字MT1173 魔數MT11…

es線上處理命令記錄

常用命令 搜索 GET _search {"query": {"match_all": {}} }獲取全部模版 GET _index_template GET _index_template/yst_crawler_template獲取全部索引 GET /_cat/indices?v 獲取當前mapping GET /yst_crawler/_mapping創建一個mapping PUT /yst_c…

WebGL游戲站優化實錄【myshmup.com】

myshmup.com 允許在瀏覽器中創建 shmup&#xff08;射擊&#xff09;游戲。 你可以使用具有創意通用許可證的資源或上傳自己的藝術作品和聲音。 創建的游戲可以在網站上發布。 該平臺不需要編碼&#xff0c;游戲對象的配置是在用戶界面的幫助下執行的。 后端是使用Django框架開…

機器學習筆記 - 使用 ResNet-50 和余弦相似度的基于圖像的推薦系統

一、簡述 這里的代碼主要是基于圖像的推薦系統,該系統利用 ResNet-50 深度學習模型作為特征提取器,并采用余弦相似度來查找給定輸入圖像的最相似嵌入。 該系統旨在根據所提供圖像的視覺內容為用戶提供個性化推薦。 二、所需環境 Python 3.x tensorflow ==2.5.0 numpy==1.21.…

星際爭霸之小霸王之小蜜蜂(三)--重構模塊

目錄 前言 一、為什么要重構模塊 二、創建game_functions 三、創建update_screen() 四、修改alien_invasion模塊 五、課后思考 總結 前言 前兩天我們已經成功創建了窗口&#xff0c;并將小蜜蜂放在窗口的最下方中間位置&#xff0c;本來以為今天將學習控制小蜜蜂&#xff0c;結…

GPT-4一紙重洗:從97.6%降至2.4%的巨大挑戰

斯坦福大學和加州大學伯克利分校合作進行的一項 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明&#xff0c;隨著時間的推移&#xff0c;GPT-4 的響應能力非但沒有提高&#xff0c;反而隨著語言模型的進一步更新而變得更糟糕。 研究小組評估了 2023 年 3 月和 20…