deque用法 和與vector的區別

2022-03-27 13:57:49 字數 2562 閱讀 2053

deque是雙向開口的連續性儲存空間。雖說是連續性儲存空間,但這種連續性只是表面上的,實際上它的記憶體是動態分配的,它在堆上分配了一塊一塊的動態儲存區,每一塊動態儲存去本身是連續的,

deque

自身的機制把這一塊一塊的儲存區虛擬地連在一起。

它首次插入乙個元素,缺省會動態分配512

位元組空間,當這

512位元組空間用完後,它會再動態分配自己另外的

512位元組空間,然後虛擬地連在一起。

deque

的這種設計使得它具有比

vector

複雜得多的架構、演算法和迭代器設計。它的效能損失比之

vector

,是幾個數量級的差別。所以說,

deque

要慎用使用deque

之前,必須先包含標頭檔案

:#include 

deque類是定義於命名空間

std內的乙個

class template

:namespace std 

與vector

相比,deque

功能上的不同之處在於:

1)兩端都能快速插入元素和刪除元素(

vector

只在尾端快速進行此類操作)。

2)訪問元素時,

deque

的內部結構會多乙個間接過程,所以元素的訪問和迭代器的動作會稍稍慢一些。

3)迭代器需要在不同區塊間跳轉,所以必須是特殊的智慧型指標,非一般指標。

4)在對記憶體區塊有所限制的系統中(例如

pc系統),

deque

可以內含更多元素,因為它使用不止一塊記憶體。因此

deque

的max_size()

可能更大。

5)deque

不支援對容量和記憶體重分配時機的控制。特別要注意的是,除了頭尾兩端,在任何地方插入或刪除元素,都將導致指向

deque

元素的任何指標、引用、迭代器失效。不過,

deque

的記憶體重分配優於

vector

,因為其內部結構顯示,

deque

不必在記憶體重分配時複製所有元素。

6)deque

的記憶體區塊不再被使用時,會被釋放。

deque

的記憶體大小是可縮減的。

deque的儲存形式如下:

[堆1]

...[堆

2]...

[堆3]

每個堆儲存好幾個元素,

然後堆和堆之間有指標指向

,看起來像是

list

和vector

的結合品

,不過確實也是如此

deque可以讓你在前面快速地新增刪除元素

,或是在後面快速地新增刪除元素

,然後還可以有比較高的隨機訪問速度

vector是可以快速地在最後新增刪除元素

,並可以快速地訪問任意元素

list是可以快速地在所有地方新增刪除元素

,但是只能快速地訪問最開始與最後的元素

deque在開始和最後新增元素都一樣快

,並提供了隨機訪問方法,像

vector

一樣使用

訪問任意元素

,但是隨機訪問速度比不上

vector快,

因為它要內部處理堆跳轉

deque也有保留空間.另外

,由於deque

不要求連續空間

,所以可以儲存的元素比

vector更大,

這點也要注意一下

.還有就是在前面和後面新增元素時都不需要移動其它塊的元素

,所以效能也很高。

以下情形,最好採用deque

:1)需要在兩端插入和刪除元素。

2)無需引用容器內的元素。

3)要求容器釋放不再使用的元素。

deque的各項操作只在以下幾點和

vector

不同:1)

deque

不提供容量操作(

capacity()

和reserve()

)。2)

deque

直接提供函式,用以完成頭部元素的插入和刪除(

push_front()

和pop_front()

)。除了at()

,沒有任何成員函式會檢查索引或迭代器是否有效。元素的插入或刪除可能導致記憶體重新分配,所以任何插入或刪除動作都會使所有指向

deque

元素的指標、引用和迭代器失效。惟一例外的是在頭部或尾部插入元素,操作之後,指標和引用仍然有效,但迭代器將失效。

deque頭部元素的插入和刪除

dequed;

for (int index = 0; index < 10; index++)

d.pop_front();

異常處理

c++標準程式庫保證下列行為:

1)如果以

push_back()

或push_front()

插入元素時發生異常,則該操作不帶來任何效應。

2)pop_back()

和pop_front()

不會丟擲任何異常。

deque與vector的區別

申明儲存空間之後,第乙個元素的位址一直是恆定的,新增元素是只能向後生長,push front 操作需要將所有的元素向後移動一片空間。vector被定義之後一般會有乙個預定的空間capacity 空間不夠的時候才會去申請新的空間 deque在定義儲存空間之後,沒有預設的空間大小,是在元素新增的時候實時...

vector與list與deque比較

vector 表示一段連續的記憶體區域每個元素被順序儲存在這段記憶體中對vector 的隨機 訪問比如先訪問元素5 然後訪問15 然後再訪問7 等等效率很高因為每次訪問離vector 起始處的位移都是固定的但是在任意位置而不是在vector 末尾插人元素則效率很低 因為它需要把待插入元素右邊的每個元...

vector與 list與 deque的比較

vector表示一段連續的記憶體區域每個元素被順序儲存在這段記憶體中對vector的隨機 訪問比如先訪問元素5 然後訪問15 然後再訪問7 等等效率很高因為每次訪問離vector 起始處的位移都是固定的但是在任意位置而不是在vector末尾插人元素則效率很低 因為它需要把待插入元素右邊的每個元素都拷...