一文快速掌握C++雙端數(shù)組容器deque的使用
deque容器的概念模型
是雙端數(shù)組,可以對(duì)頭部進(jìn)行插入刪除操作
示意圖
值得注意的是deque容器比vector容器多了頭插、頭刪的操作以及front()和back(),后面這兩個(gè)分別代表容器的第一個(gè)元素和最后一個(gè)元素,并不是迭代器,調(diào)用他們會(huì)得到具體的值。
deque與vector的區(qū)別:
- vector對(duì)于頭部的插入刪除效率低,數(shù)據(jù)量越大,效率越低
- deque相對(duì)而言,對(duì)頭部的插入刪除速度會(huì)比vector快
- vector訪問(wèn)元素時(shí)的速度會(huì)比deque快,這和兩者內(nèi)部實(shí)現(xiàn)有關(guān)
deque的內(nèi)部工作原理:
1.deque內(nèi)部有個(gè)中控器,維護(hù)每段緩沖區(qū)中的內(nèi)容,緩沖區(qū)中存放真實(shí)數(shù)據(jù)。
2.中控器維護(hù)的是每個(gè)緩沖區(qū)的地址,使得使用deque時(shí)像一片連續(xù)的內(nèi)存空間
3.deque的迭代器也是支持隨機(jī)訪問(wèn)的
4.圖示:
deque進(jìn)行插入的時(shí)候是在結(jié)點(diǎn)對(duì)應(yīng)的緩沖區(qū)操作的,緩沖區(qū)不有位置的時(shí)候直接插入到緩沖區(qū)中,緩沖區(qū)滿的話就開(kāi)辟新節(jié)點(diǎn),再進(jìn)行插入,所以才說(shuō)像是連續(xù)的存儲(chǔ)空間。
deque容器的基本操作
包括構(gòu)造方法、賦值、計(jì)算大小、插入刪除等
構(gòu)造函數(shù)
deque容器的構(gòu)造
函數(shù)原型
- deque<T> deq;其中T是泛型,用來(lái)存放數(shù)據(jù)類型,這是默認(rèn)構(gòu)造函數(shù),較為常用
- deque(deq.begin(),deq.end()); 將[deq.begin(),deq.end)前閉后開(kāi)的區(qū)間內(nèi)的元素拷貝給本身容器
- deque(n,elem);構(gòu)造函數(shù)將n個(gè)elem值拷貝給本身容器
- deque(const deque &ans);拷貝構(gòu)造函數(shù)
代碼示例:
//打印 void printDeque(const deque<int>& d)//只讀容器不可改 {//迭代器變?yōu)?const_iterator for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } void testa() { //構(gòu)造: //第一種 deque<int>d1; for (int i = 0; i < 10; i++) { //d1.push_back(i); 頭插尾插都可以 d1.push_front(i); } //第二種 deque<int>d2(d1.begin(), d1.end()); //第三種 deque<int>d3(d2); //第四種 deque<int>d4(6, 100); //測(cè)試輸出 printDeque(d1); printDeque(d2); printDeque(d3); printDeque(d4); //排序 cout << "排序" << endl; sort(d1.begin(), d1.end()); printDeque(d1); }
tips:如果將打印語(yǔ)句設(shè)為只讀,那么迭代器類型也要變?yōu)椋篶onst_iterator。
賦值操作
給deque容器賦值
函數(shù)原型:
- deque& operator=(const deque &ans);重載賦值操作符
- assign(be,en);將[be,en);將[be,en)區(qū)間內(nèi)的數(shù)組拷貝賦值給自己
- assign(n,elem);將n個(gè)elem拷貝賦值給自己
代碼示例:
void testb() { //賦值: deque<int>d1; for (int i = 0; i < 10; i++) { d1.push_back(i); } //第一種 deque<int>d2 = d1; //第二種 deque<int>d3; d3.assign(d1.begin(), d1.end()); //第三種 deque<int>d4; d4.assign(6, 88); //測(cè)試: printDeque(d2); printDeque(d3); printDeque(d4); }
容器大小
對(duì)deque的大小進(jìn)行操作
deque.empty();判斷容器是否為空
deque.size();返回容器中元素的個(gè)數(shù)
deque.resize(m);重新指定容器長(zhǎng)度為num,容器變長(zhǎng)以默認(rèn)值填充,容器變短則超出部分刪除
deque.resize(m,elem);同上,區(qū)別是默認(rèn)值填充變?yōu)閑lem值填充
代碼示例:
void testc() { //大小的操作: //size: deque<int>d; if (d.empty()) { cout << "此時(shí)容器為空" << endl; cout << "打印容器的大?。? << d.size() << endl; } for (int i = 0; i < 7; i++) { d.push_back(i); } cout << "打印容器的大小:" << d.size() << endl; printDeque(d); //resize d.resize(10,100); cout << "打印容器的大?。? << d.size() << endl; printDeque(d); d.resize(5); cout << "打印容器的大?。? << d.size() << endl; printDeque(d); }
tips:
- deque沒(méi)有容量概念
- 判斷是否為空——empty
- 返回元素個(gè)數(shù)——size
- 重新指定個(gè)數(shù)——resize
插入和刪除
向deque容器中插入和刪除數(shù)據(jù)
函數(shù)原型:
兩端操作:
- push_back(e);尾插
- push_front(e);頭插
- pop_back(); 尾刪
- pop_front(); 頭刪
指定位置:
- insert(const_iterator pos,e);迭代器指向位置pos插入指定元素e
- insert(const_iterator pos,int count ,e); 插入count個(gè)指定元素e
- insert(const_iterator pos,beg,en);插入指定區(qū)域的元素
- erase(const_iterator pos);刪除迭代器指向的元素
- erase(const_iterator begin,const_iterator end);刪除迭代器從begin到end之間的元素
- clear();清空容器內(nèi)所有元素
代碼示例:
//兩端操作 void test01() { deque<int>d1; //尾插 d1.push_back(10); d1.push_back(20); //頭插 d1.push_front(100); d1.push_front(200); PrintDeque(d1); //尾刪 d1.pop_back(); PrintDeque(d1); //頭刪 d1.pop_front(); PrintDeque(d1); } void test02() { deque<int>d2; //尾插 d2.push_back(10); d2.push_back(20); //頭插 d2.push_front(100); d2.push_front(200); PrintDeque(d2); //insert插入 d2.insert(d2.begin(), 1000); PrintDeque(d2); d2.insert(d2.begin(), 2,10000); PrintDeque(d2); //按照區(qū)間進(jìn)行插入 deque<int>d3; d3.push_back(1); d3.push_back(2); d3.push_back(3); d2.insert(d2.begin(), d3.begin(), d3.end()); PrintDeque(d2); } void test03() { deque<int>d4; //尾插 d4.push_back(10); d4.push_back(20); //頭插 d4.push_front(100); d4.push_front(200); PrintDeque(d4); //刪除 deque<int>::iterator it = d4.begin(); it++; d4.erase(it); PrintDeque(d4); //按照區(qū)間方式刪除 d4.erase(d4.begin(), d4.end()); PrintDeque(d4); //清空 d4.clear(); PrintDeque(d4); }
數(shù)據(jù)存取
對(duì)deque中的元素進(jìn)行存取操作
函數(shù)原型:
- at(int dex);返回索引dex所指的數(shù)據(jù)
- operator[];同上
- front();返回容器中第一個(gè)數(shù)據(jù)
- back();返回容器中最后一個(gè)數(shù)據(jù)
代碼示例:
//通過(guò)[]方式訪問(wèn)元素 for (int i = 0; i < d1.size(); i++) { cout << d1[i] << " "; } cout << endl; //通過(guò)at方式訪問(wèn)元素 for (int i = 0; i < d1.size(); i++) { cout << d1.at(i) << " "; }
排序
需要引入頭文件:<algorithm>
利用算法實(shí)現(xiàn)對(duì)deque容器的排序
算法:sort(iterator beg,iterator en); 對(duì)beg和en的區(qū)間升序排序
tips:對(duì)于支持隨機(jī)訪問(wèn)的迭代器都可以用sort進(jìn)行排序
到此這篇關(guān)于一文快速掌握C++雙端數(shù)組容器deque的使用的文章就介紹到這了,更多相關(guān)C++雙端數(shù)組容器deque內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它2022-07-07一文搞懂C++中的四種強(qiáng)制類型轉(zhuǎn)換
很多朋友向小編了解C語(yǔ)言中怎么進(jìn)行強(qiáng)制類型轉(zhuǎn)換呢?在這小編告訴大家強(qiáng)制類型轉(zhuǎn)換可以分為兩種,一種是隱式類型轉(zhuǎn)換一種是顯示類型轉(zhuǎn)換,下面通過(guò)示例代碼給大家介紹下,需要的朋友參考下吧2021-07-07c語(yǔ)言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系
以下是對(duì)c語(yǔ)言中的malloc函數(shù),realloc函數(shù)與calloc函數(shù)的區(qū)別以及它們之間的聯(lián)系進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08用C# 控制Windows系統(tǒng)音量的實(shí)現(xiàn)方法
本篇文章是對(duì)使用C#控制Windows系統(tǒng)音量的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Qt實(shí)現(xiàn)模糊匹配功能的實(shí)例詳解
對(duì)于瀏覽器的使用,我想大家一定不會(huì)陌生吧,輸入要搜索的內(nèi)容時(shí),會(huì)出現(xiàn)相應(yīng)的匹配信息。本文就來(lái)用Qt實(shí)現(xiàn)模糊匹配功能,感興趣的可以了解一下2022-10-10