加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

重读STL源码剖析:deque

发布时间:2020-12-15 07:47:24 所属栏目:Java 来源:网络整理
导读:deque deque是一种双向开头的现行连续空间 但它与vector有差异: 1.deque可以在O(1)的复杂度下进行头端插入与移除,而vector的头端操作效率极差 2.deque没有capacity概念。deque随时可以拼接一段新的连续空间。只有像vector这种可能出现空间不足的容器才需

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的前一个元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读