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末尾插人元素則效率很低 因為它需要把待插入元素右邊的每個元素都拷...