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)步