最詳細STL(二)deque
阿新 • • 發佈:2021-10-06
deque其實也是陣列,也可以動態的新增和減少元素,但是和vector不同的是,deque可以快速的在頭部和尾部新增減少元素(vector只能快速的在尾部新增),然而在插入元素的時候因為頭部和尾部都可以新增元素,deque則會選擇最近的一端來迭代過去,並插入元素。不過deque更優勢的是,記憶體空間是不連續的。
一、deque的記憶體空間是不連續的
為了驗證不連續,我寫了一段程式碼供大家觀賞
#include<cstdio> #include<deque> #include<vector> using namespace std; int main() {int testnum = 100; deque<int> md(testnum+1);// +1防止索引越界 int issame = 0; for(int i=0;i<testnum;i++) { // 判斷是否是連續陣列,不是就列印,是就issame++ if(&md[i+1]-&md[i]!=1) { printf("%d %d %d %d\n",&md[i+1]-&md[i],&md[i+1],&md[i], issame); issame=0; } else issame++; } return 0; }
當testnum為100的時候沒有輸出,說明還是連續的,但是testnum變成1000的時候有了輸出,這也就驗證了deque是不連續的,當testnum是10000不連續的區域就更多了
testnum=100
testnum=1000
testnum=10000
發現規律了沒有,每一個連續的區域大小都是127然而這樣不連續的資料結構可以更好的利用空間,也就是陣列和連結串列的結合版。
下面開始正文了,我來告訴大家deque什麼時候用?怎麼用?用的時候要注意些什麼吧?
二、什麼時候用
從上面的小實驗得出,deque還是優於vector的,只是空間不連續。忽略空間的連續性和next指標,vector相當於普通連結串列,而deque就相當於有兩個指標分別指向頭和尾的連結串列。所以基本上在沒有空間連續的需求,完全deque可以替代vector。
三、怎麼用
1.訪問元素
方法 | 解釋 |
d[i] | 通過下標訪問i位置元素的值 |
d.at[i] | 通過下標訪問i位置元素的值 |
d.front() | 訪問deque頭部元素的值 |
d.back() | 訪問deque尾部元素的值 |
d.begin() | 生成頭部迭代器(某種意義上的指標) |
d.end() | 生成尾部迭代器(某種意義上的指標) |
2.新增元素
d.push_back(num) | 在d的尾部新增num值 |
d.push_front() | 在d的頭部新增num值 |
d.insert(pos,elem) | pos是vector的插入元素的位置 |
d.insert(pos, n, elem) | 在位置pos上插入n個元素elem |
d.insert(pos, begin, end) |
3.刪除元素
d.pop_back() | 刪除佇列尾部元素 |
d.pop_front() | 刪除佇列頭部元素 |
d.erase(pos) | 刪除pos位置上的元素 |
d.erase(begin, end) | 刪除begin到end區間上的元素,返回下一個元素的位置 |
4.deque其它操作
d.size() |
檢視deque的大小 |
d.empty() |
判斷deque是否為空 |
d.clear() |
清空deque |
四、用的時候要注意什麼?
也是和vector一樣,需要頻繁的在佇列中進行元素的增刪,這種資料結構還是不適合的
且下標的訪問也不要越界