deque源碼1(deque概述、deque中的控制器)
html
deque源碼2(deque迭代器、deque的數據結構)前端
deque源碼3(deque的構造與內存、ctor、push_back、push_front)數據結構
deque源碼4(deque元素操做:pop_back、pop_front、clear、erase、insert)架構
deque概述dom
vector是單向開口的連續性線性空間,deque則是一種雙開的連續性空間,即兩邊均可以進行插入和刪除操做(vector也可進行頭部的刪除、插入操做,但效率不好,不被接受)。post
deque和vector最大差別,一是deque容許在常數時間內對頭部元素進行插入和移除操做,二在於deque沒有所謂的容量的概念,由於它是動態地以分段連續空間組合而成,隨時能夠增長一段新的空間並鏈接起來。spa
雖然deque也提供Random Access Iterator,但它的迭代器並非普通指針,其複雜度遠高於vector,因此除非必要儘量使用vector。爲了deque排序效率最高,deuqe會先將全部的元素複製到vector中,進行排序後,再複製回deque。設計
deque中的控制器指針
deque是一段一段連續的空間構成,一旦在deque前端或尾端增長新空間,便配置一段定量連續空間,串聯在頭端和尾端。deque的最大任務就是將這些定量的空間,維護成連續的假象,並提供隨機存儲的接口,避開了「從新配置、複製、釋放」的輪迴,代價便是複雜的迭代器架構。code
既然是分段連續的線性空間,就必需要有中央控制,而爲了維持連續的假象,數據結構的設計及迭代器前進後退等操做都比較麻煩,因此deque的實現代碼份量遠比vector或list都多得多。
deque採用一塊map(不是STL的map容器)做爲主控,這裏的map是一塊連續空間,其中每一個元素都是指針,指向另外一段連續線性空間,稱爲緩衝區。緩衝區纔是deque的存儲空間主體。
template <class T,class Alloc=alloc,size_t BufSiz=0> class deque{ public: typedef T value_type; typedef value_type* pointer; ... protected: typedef pointer* map_pointer; protected: map_pointer map; //指向map,map是連續空間,其內的每一個元素都是一個指針,指向一塊緩衝區 size_type map_size; //map可容納多少指針 ... };
從上面能夠看出,map實際上是一個T**,也就是說它是一個指針,所指向另外一個指針,指向型別爲T的一塊空間。具體以下圖: