怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样。然而事实上却没有那么简单,准确来讲deque实际上是一种分段连续空间,所以其实现以及各类操做比vector复杂的多。前端
一.deque的中控器node
deque是有一段一段的定量连续空间构成,采用一块所谓的map(固然不是map容器)做为主控。map是一小块连续空间,其中每个元素都是一个指针,指向另外一段连续性空间(缓冲区)。缓冲区才是deque的储存空间主体。咱们能够指定缓冲区大小,默认值0表示使用512字节缓冲区。deque设计结构以下图所示:后端
二.deque的数据结构数据结构
deque除了维护map的指针外,也要维护start,finish两个迭代器,分别指向第一缓冲区的第一个元素和最后缓冲区的最后一个元素(的下一个位置)。此外,它还要记录当前map的大小,由于当map结点不够的时候,须要另外配置一个更大的map,计算其大小须要知道当前map的大小(源码为:new_map_size=map_size+max(map_size,nodes_to_add)+2;)。deque数据结构以下:函数
class deque { public: typedef T value_type; typedef valude_type *pointer; typedef size_f size_type; public: //迭代器 typedef __deque_iterator<T,T&,T*,BufSiz> iterator; protected: //元素的指针的指针 typedef pointer *map_pointer; protected: iterator start; iterator finish; map_pointer map; size_type map_size; //map中指针个数 ... };
三.deque的成员函数spa
考虑到deque的特殊结构,因此实现deque的各类操做都至关琐碎复杂。最关键的就是判断是否已经处于缓冲区边缘,若是是,一旦前进或后退就必须跳跃至下一个或上一个缓冲区。还有一个重要问题就是当map前端或尾端备用空间不足时就要从新配置新map(配置更大的,拷贝原来的,释放原来的),下面的push_back()和push_front()等函数都须要先判断。下面分别解释deque的各个成员函数。设计
四.配接器stack和queue指针
stack是一种先进后出(FILO)的数据结构,它只有一个出口。deque是双向开口的数据结构,因此SGI STL便以deque做为缺省状况下的stack底部结构,封闭其头端开口。stack没有迭代器,因此除了顶部元素,没法存取其它元素,即不能遍历stack。blog
stack的成员函数都是针对其顶部元素进行操做:push(),pop(),top()。源码
queue是一种先进先出(FIFO)的数据结构,它有两个出口。queue也是以deque做为底部结构,封闭其底端的出口和前端的入口。queue,只有顶端(两端)的元素能被外部使用,因此queue也没有迭代器,不提供遍历功能。
queue的成员函数有:front(),back(),push(),pop()。
能够看到stack和queue的成员函数以及特性都是针对其数据结构来的,因此深刻理解其内部结构,不易与deque众多的成员函数混淆。固然stack和queue也能够list为底层结构实现。
参考:《STL源码剖析》