1、簡介
deque 也是順序容器的一種,同時也是一個可變長數組。要使用 deque,需要包含頭文件 deque。所有適用於 vector 的操作都適用於 deque。
在 deque 中,隨機存取任何元素都能在常數時間內完成(但慢於vector)。它相比於 vector 的優點是,vector 在頭部刪除或添加元素的速度很慢,在尾部添加元素的性能較好,而 deque 在頭尾增刪元素都具有較好的性能(大多數情況下都能在常數時間內完成)。它有兩種 vector 沒有的成員函數:
void push_front (const T & val); //將 val 插入容器的頭部
void pop_front(); //刪除容器頭部的元素
2、deque的中控器
deque是由一段一段的定量連續空間構成。一旦有必要在deque的前端或尾端增加新空間,便配置一段定量連續空間,串接在整個deque的頭端或尾端。
deque的最大任務,便是在這些分段的定量連續空間上,維護其整體連續的假象,並提供隨機存取的接口。避開了“重新配置、復制、釋放”的輪回,代價則是復雜的迭代器架構。
deque采用一塊所謂的map(注意,不是STL的map容器)作為主控。這里所謂map是一小塊連續空間 ,其中每個元素(此處稱為一個節點, node)都是指針,指向另一段(較大的) 連續線性空間,稱為緩沖區。緩沖區才是deque的存儲空間主體。
3、數據結構

1 template <class T, class Allod alloc, size_t Bufsiz = 0> 2 3 class deque { 4 5 public: 6 typedef T value_type; 7 typedef value_type* pointer; 8 ... 9 10 protected: 11 typedef pointer* map pointer; 12 13 protected: 14 map_pointer map;//指向map,map是塊連續空間,其內的每個元素都是一個指針,指向一塊緩沖區 15 size_type map_size;//map可容納多少指針 16 17 ... 18 19 }
4、構造和內存管理
如果申請的map空間不夠時,也需要重新配置更大的空間,將原來map里的指針拷貝過來,最后釋放原來的空間。
5、和vector的區別
vector是單向開口的連續線性空間, dequeu是一種雙向開口的連續線性定 ;
deque允許於常數時間內對起頭端進行元素的插入或移除操作 ;
deque沒有所謂容量(capacity)觀念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈接起來