deque结构

deque是双向队列,其可以在头尾部分做元素的插入和删除。其实现类似于vector可以动态扩容。
STL——deque
上图是deque的整体结构,中控部分实际上类似于map结构,是一段连续的存储空间,每个map_pointer结点都是一个指针,指向另一段连续的存储空间,称为缓冲区(buffer)。因此实际上,deque是分段连续的空间,对外表现为连续的。由上图可知,每个map_pointer结点有四个成员,cur表示元素在缓冲区的位置,first表示缓冲区的起始位置,last表示缓冲区的尾部,node表示map_pointer在中控结构的位置。
STL——deque
上图是deque的代码实现,我们可以看到一个deque类包含四个成员,迭代器start表示中控器的起始端,finish表示中控器的尾端,map表示中控器的结点,注意map_pointer是指向指针的指针。map_size表示中控器的大小。
STL——deque
上图是迭代器的实现,可以发现迭代器类正好对应上面讲解的部分,cur,first,last,node等的含义。

插入

STL——deque
当使用插入函数时,会根据插入位置进行相应的操作,因为每次插入都会使其它部分元素移动,造成额外消耗,因此会选择消耗最小的位置进行插入。如果位置在首端或尾端直接插入即可,如果在中间位置插入需要判断距离收尾那个位置近。如下图
STL——deque
如果安插点距离首端近,那么在首部插入一个该元素,该部分的所有元素搬移,如果插入点距离尾端近,那么在尾部插入一个元素,并将该部分的所有元素搬移。

模拟成连续空间

STL——deque
STL——deque
模拟连续空间主要是通过迭代器实现的,操作符重载即可实现。“-”实现两个迭代器的距离,即中间有多少个元素。
STL——deque
“++”的重载,如果cur到达缓冲区的尾端,需要跳到下一个缓冲区,“–”原理类似。
STL——deque
“+=”和“++”类似,都需要判断是否在同一个缓冲区,在的话直接操作即可,不在的话需要跳跃缓冲区。
STL——deque
“-=”操作更简单了,可以直接调用“+=”实现。

queue和stack的实现

STL——deque
STL——deque
知道deque后,stack和queue的实现就很简单了,默认底层调用deque。
STL——deque
STL——deque
STL——deque

当然除了deque外,还可以使用其它容器作为底层支撑。

相关文章: