【通俗易懂C++ STL模板庫(kù)】Deque 容器

Deque 簡(jiǎn)介

deque 是“double-ended queue ”的縮寫, 和 vector 一樣都是 STL的容器, deque 是雙 端數(shù)組 ,而 vector 是單端的。?

deque 在接口上和 vector 非常相似,在許多操作的地方可以直接替換。?

deque 可以隨機(jī)存取元素。?

deque 頭部和尾部添加或移除元素都非??焖?。但是在中部安插元素或移除元素比 較費(fèi)時(shí)。

#include <deque>?

deque 對(duì)象的默認(rèn)構(gòu)造

deque 采用模板類實(shí)現(xiàn), deque 對(duì)象的默認(rèn)構(gòu)造形式: deque<T> deqT; deque <int> deqInt; // 一個(gè)存放 int 的 deque 容器。?

deque <float> deq Float; // 一個(gè)存放 float 的 deque 容器。?

deque <string> deq String; // 一個(gè)存放 string 的 deque 容器。

// 尖括號(hào)內(nèi)還可以設(shè)置指針類型或自定義類型。

deque 末尾的添加移除操作

理論知識(shí) :?

deque.push_back(elem); // 在容器尾部添加一個(gè)數(shù)據(jù)?

deque.push_front(elem); // 在容器頭部插入一個(gè)數(shù)據(jù)?

deque.pop_back(); // 刪除容器最后一個(gè)數(shù)據(jù)?

deque.pop_front(); // 刪除容器第一個(gè)數(shù)據(jù)

deque<int> deqInt;?

deqInt.push_back(1);?

deqInt.push_back(3);?

deqInt.push_back(5);?

deqInt.push_back(7);?

deqInt.push_back(9);?

deqInt.pop_front();?

deqInt.pop_front();?

deqInt.push_front(11);?

deqInt.push_front(13);?

deqInt.pop_back();?

deqInt.pop_back();?

//deqInt { 13,11,5}?

deque 的數(shù)據(jù)存取

理論知識(shí) :?

deque.at(idx);?

// 返回索引 idx 所指的數(shù)據(jù),如果 idx 越界,拋出 out_of_range?

?deque[idx];

?// 返回索引 idx 所指的數(shù)據(jù),如果 idx 越界,不拋出異常,直接出錯(cuò)。 deque.front();

?// 返回第一個(gè)數(shù)據(jù)。 deque.back(); // 返回最后一個(gè)數(shù)據(jù)

deque<int> deqInt;?

deqInt.push_back(1);?

deqInt.push_back(3);?

deqInt.push_back(5);?

deqInt.push_back(7);?

deqInt.push_back(9);?

int iA = deqInt.at(0); //1?

int iB = deqInt[1]; //3?

deqInt.at(0) = 99; //99?

deqInt[1] = 88; //88?

int iFront = deqInt.front(); //99?

int iBack = deqInt.back(); //9?

deqInt.front() = 77;? //77?

deqInt.back() = 66; //66?

deque 與迭代器

理論知識(shí)?

deque.begin(); // 返回容器中第一個(gè)元素的迭代器。?

deque.end(); // 返回容器中最后一個(gè)元素之后的迭代器。?

deque.rbegin(); // 返回容器中倒數(shù)第一個(gè)元素的迭代器。?

deque.rend(); // 返回容器中倒數(shù)最后一個(gè)元素之后的迭代器。

deque<int> deqInt;?

deqInt.push_back(1);?

deqInt.push_back(3);?

deqInt.push_back(5);?

deqInt.push_back(7);?

deqInt.push_back(9);?

for (deque<int>::iterator it=deqInt.begin(); it!=deqInt.end(); ++it)?

{?

cout << *it;?

cout << "";?

}?

for (deque<int>::reverse_iterator rit=deqInt.rbegin(); rit!=deqInt.rend(); ++rit)?

{?

cout << *rit;?

cout << "";?

}?

deque 對(duì)象的帶參數(shù)構(gòu)造

理論知識(shí) deque(beg,end); // 構(gòu)造函數(shù)將 [beg, end)區(qū)間中的元素拷貝給本身。注意該區(qū)間 是左閉右開的區(qū)間。 deque(n,elem); // 構(gòu)造函數(shù)將 n 個(gè) elem 拷貝給本身。 deque(const deque &deq); // 拷貝構(gòu)造函數(shù)。

deque<int> deqIntA;?

deqIntA.push_back(1);?

deqIntA.push_back(3);?

deqIntA.push_back(5);?

deqIntA.push_back(7);?

deqIntA.push_back(9);?

deque<int> deqIntB(deqIntA.begin(),deqIntA.end()); //1 3 5 7 9?

deque<int> deqIntC(5,8); //8 8 8 8 8?

deque<int> deqIntD(deqIntA); //1 3 5 7 9?

deque 的賦值

理論知識(shí)

?deque.assign(beg,end);?

// 將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。 注意該區(qū)間 是左閉右開的區(qū)間。 deque.assign(n,elem); // 將 n 個(gè) elem 拷貝賦值給本身。?

deque& operator=(const deque &deq); // 重載等號(hào)操作符?

deque.swap(deq); // 將 vec 與本身的元素互換

deque<int> deqIntA,deqIntB,deqIntC,deqIntD;?

deqIntA.push_back(1);?

deqIntA.push_back(3);?

deqIntA.push_back(5);?

deqIntA.push_back(7);?

deqIntA.push_back(9);?

deqIntB.assign(deqIntA.begin(),deqIntA.end()); // 1 3 5 7 9?

deqIntC.assign(5,8); //8 8 8 8 8?

deqIntD = deqIntA;? //1 3 5 7 9?

deqIntC.swap(deqIntD);? // 互換

deque 的大小

理論知識(shí)?

deque.size(); // 返回容器中元素的個(gè)數(shù)?

deque.empty();? // 判斷容器是否為空?

deque.resize(num); // 重新指定容器的長(zhǎng)度為 num,若容器變長(zhǎng),則以默認(rèn)值填充 新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。 deque.resize(num, elem); // 重新指定容器的長(zhǎng)度為 num,若容器變長(zhǎng),則以 elem 值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除。

deque<int> deqIntA;?

deqIntA.push_back(1);?

deqIntA.push_back(3);?

deqIntA.push_back(5);?

int iSize = deqIntA.size(); //3?

if (!deqIntA.empty())?

{?

????deqIntA.resize(5); //1 3 5 0 0?

????deqIntA.resize(7,1); / /1 3 5 0 0 1 1?

????deqIntA.resize(2); //1 3?

}?

deque 的插入

理論知識(shí)?

deque.insert(pos,elem); // 在 pos位置插入一個(gè) elem 元素的拷貝,返回新數(shù)據(jù)的位置。?

deque.insert(pos,n,elem); // 在 pos 位置插入 n 個(gè) elem 數(shù)據(jù),無(wú)返回值。 deque.insert(pos,beg,end); // 在 pos 位置插入 [beg,end) 區(qū)間的數(shù)據(jù),無(wú)返回值。

deque<int> deqA;?

deque<int> deqB;?

deqA.push_back(1);?

deqA.push_back(3);?

deqA.push_back(5);?

deqA.push_back(7);?

deqA.push_back(9);?

deqB.push_back(2);?

deqB.push_back(4);?

deqB.push_back(6);?

deqB.push_back(8);?

deqA.insert(deqA.begin(), 11); //{11, 1, 3, 5, 7, 9}?

deqA.insert(deqA.begin()+1,2,33);? //{11,33,33,1,3,5,7,9}?

deqA.insert(deqA.begin() , deqB.begin() , deqB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}?

deque 的刪除

理論知識(shí)?

deque.clear(); // 移除容器的所有數(shù)據(jù)?

deque.erase(beg,end); // 刪除 [beg,end) 區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。?

deque.erase(pos); // 刪除 pos 位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。

刪除區(qū)間內(nèi)的元素?

deqInt 是用 deque<int> 聲明的容器,現(xiàn)已包含按順序的 1,3,5,6,9 元素。

deque<int>::iterator itBegin=deqInt.begin()+1;?

deque<int>::iterator itEnd=deqInt.begin()+3;?

deqInt.erase(itBegin,itEnd); // 此時(shí)容器 deqInt 包含按順序的 1,6,9 三個(gè)元素。

假設(shè) deqInt 包含 1,3,2,3,3,3,4,3,5,3,刪除容器中等于 3 的元素 for(deque<int>::iterator it=deqInt.being(); it!=deqInt.end(); ) // 小括號(hào)里不需寫 ++it?

{?

if(*it == 3)?

{?

it = deqInt.erase(it); // 以迭代器為參數(shù),刪除元素 3,并把數(shù)據(jù)刪除后的 下一個(gè)元素位置返回給迭代器。 // 此時(shí),不執(zhí)行 ++it; }?

else?

{?

????????++it;?

}?

}?

每天進(jìn)步一點(diǎn)點(diǎn),如果有用給小編點(diǎn)個(gè)贊

專注Linux C/C++和算法知識(shí)學(xué)習(xí)分享總結(jié)

歡迎關(guān)注交流共同進(jìn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容