1. 程式人生 > 其它 >最詳細STL(二)deque

最詳細STL(二)deque

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一樣,需要頻繁的在佇列中進行元素的增刪,這種資料結構還是不適合的

且下標的訪問也不要越界