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的一块空间。具体以下图: