重读STL源码剖析:deque

deque

deque是一种双向开头的现行连续空间

但它与vector有差异:

1.deque可以在O(1)的复杂度下进行头端插入与移除,而vector的头端操作效率极差

2.deque没有capacity概念。deque随时可以拼接一段新的连续空间。只有像vector这种可能出现空间不足的容器才需要capacity与reserve的概念。包括list也是不需要capacity与reserve的、

3.vector的迭代器是简单的T*型指针,而deque比这复杂得多,虽然也是Random Access Iterator

数据结构:

最主要的就是两个变量mao和mapsize.

首先介绍下map:map是deque的主控。它是一小块连续地址空间,其中每个元素都是一个指针,指针指向另一段较大的线性连续空间,称作缓冲区。缓冲区才是deque存储空间的主体。

设存储的元素类型为T,则map是一个T**型的指针,它指向一块地址空间,这块空间内存放的是T*型指针,map+1相当于定位到map[1]的位置。T*型指针又指向一块连续区域,这块区域就存放若干T型变量。

mapsize表示map内可存放多少指针

 

迭代器:

deque的迭代器主要有四个成员:

T* cur;

T* first;

T* last;

map_pointer node;

其中cur first last这三个都是指向缓冲区内的某个元素的指针。cur指向正指着的元素,而first为当前缓冲区的头,而last为当前缓冲区的尾。first与last有点类似vector中的start与end_of_storage

node为一个T**型指针,我们知道,deque中的主要成员变量为中控器map,通过map可以找到不同的缓冲区。而迭代器里的node就为一个T**型变量,它与中控器属于同一种类型,它指向中控器中的某个元素。由于中控器map指向一块区域,该区域内是T**型元素,而node正是指向这个迭代器所属的缓冲区,其在中控器map指向的区域里的变量。即可以通过node来定位到这块缓冲区在中控器里的位置,这样方便跨缓冲区操作

 

deque更具体的数据结构:

除了mapsize和中控器map外,deque还有两个成员:

1.迭代器start

2.迭代器finish

start指向第一缓冲区的第一个元素(指cur指向),finish指向最后缓冲区的最后一个元素的下一位置.

由于对迭代器的运算符进行了重载,像--finish这种操作,实际上是对finish中cur指向的元素向前退一个,如果cur在缓冲区第一个,则要调到finish前一个迭代器的last的前一个元素.

 

posted @ 2019-09-12 00:45  李湘沅  阅读(366)  评论(0编辑  收藏  举报