deque與vector非常相似。它也采用動態數組管理元素,提供隨機存取,有着和vector幾乎一樣的接口。不同的是deque的動態數組頭尾都開放,因此能在頭尾兩端進行快速安插和刪除。
deque通常實作為一組獨立區塊,第一區塊朝某方向擴展,最后一個區塊朝另一個方向擴展。
deque與vector的主要不同之處在於:
1. 兩端都能快速安插和刪除元素,這些操作可以在分期攤還的常數時間(amortized constant time)內完成。
2. 元素的存取和迭代器的動作比vector稍慢。
3. 迭代器需要在不同區塊間跳轉,所以它非一般指針。
4. 因為deque使用不止一塊內存(而vector必須使用一塊連續內存),所以deque的max_size()可能更大。
5. 不支持對容量和內存重新分配時機的控制。不過deque的內存重分配優於vector,因為其內部結構顯示,deque不必在內存重分配時復制所有元素。
6. 除了頭尾兩端,在任何地方安插或刪除元素,都將導致指向deque元素的所有pointers、references、iterators失效。
7. deque的內存區塊不再被使用時,會自動被釋放。deque的內存大小是可自動縮減的。
8. deque與vector組織內存的方式不一樣。在底層,deque按“頁”(page)或“塊”(chunk)來分配存儲器,每頁包含固定數目的元素。而vector只分配一塊連續的內存。例如,一個10M字節的vector使用的是一整塊10M字節的內存,而deque可以使用一串更小的內存塊,比如10塊1M的內存。所以不能將deque的地址(如&deque[0])傳遞給傳統的C API,因為deque內部所使用的內存不一定會連續。
deque的下述特性與vector差不多:
1. 在中部安插、刪除元素的速度較慢。
2. 迭代器屬於random access iterator(隨機存取迭代器)。
優先使用vector,還是deque?
c++標准建議:vector是那種應該在默認情況下使用的序列。如果大多數插入和刪除操作發生在序列的頭部或尾部時,應該選用deque。
使用deque還需注意:
1. 除了at(),其它成員函數均不會檢查索引或迭代器是否有效。
2. 任何插入或刪除動作都會使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在頭部或尾部插入元素(此時pointers和references仍然有效,但iterators失效)。