deque

一.deque概述

deque是双向开口的连续线性空间,与vector相比,deque特点主要在于是双向开口,即可以在开头和末尾进行插入删除操作,从技术观点来说vector当然也能实现头端的插入删除,不过vector的插入删除需要移动元素,在头端操作效率太低。

deque的第二个特点是它是动态地以分段连续空间组合而成,随时可以增加一段新的空间链接起来,不用像vector那样重新配置。deque实现的复杂度远高于vector,所以各种算法效率更低,有时我们要对deque执行某些算法可以先把deque的内容复制到vector中执行,然后再复制回来。

二.deque的中控器

deque是用多段定量连续空间来维持它连续线性空间的性质的,为了维护和操作这些空间,deque需要有一个中控器来控制这些空间,这个中控器叫做map,map是(或者说指向)一个指针数组,指针数组里的指针各自指向缓冲区,缓冲区就是deque用来存储数据的分段连续空间,map本质上是T**。

三.deque的迭代器

deque是线性连续空间(实质是分段连续空间),所以operator++ operator–对它表现连续性很重要,deque的迭代器中有四个重要的指针,first(指向当前缓冲区的头),last(指向当前缓冲区的尾),cur(指向当前缓冲区有值部分的尾),node(指向当前缓冲区所属map中的node),其余设计和普通的迭代器设计(如list)差不多,只不过设计到迭代器的移动的重载函数中要注意边界的判断以及涉及边界的迭代器的移动。还有,这里很多重载函数调用了其他的重载函数来实现。反正仔细看肯定能看懂这些函数。

四.deque的数据结构

deque要维护一个指向map的指针,还有first和finish两个迭代器(这两个迭代器分别指向第一个缓冲区和最后一个缓冲区,注意,按道理来说缓冲区都是有内容的),然后用first和finish两个迭代器来取值即可。

五.deque的构造与内存管理

设计好了deque的迭代器和数据结构,接下来就是构造和内存管理,其中构造最主要的还是map的创建和缓冲区的创建,这两个都是用create_map_and_nodes函数创建的,其中节点的个数的确定以及start和finish指向map中间区域的方法可以看看。

内存管理主要指的还是插入删除,如果空间还够的话没什么好说的(判断空间够不够是先判断节点够不够然后判断缓冲区剩余空间够不够),如果节点不够就重新分配map布局(让start和finish指向中间区域)或重新配置更大的空间给map,如果缓冲区剩余空间不够就用下一个缓冲区的空间。

六.deque的元素操作

deque的元素操作有很多,这里也只是选取了几个讲。

对于pop_back和pop_front,都是先判断要不要释放一个缓冲区再去析构或释放,而clear这些也不必说就是析构和释放得只剩一个缓冲区,erase和insert都涉及到元素的移动,这两个函数设计都是那一边移动得少就移动哪一边。

关于deque的元素操作,可能比较难理解的就是其中一些元素移动的操作了,不过这种可以画个图辅助理解一下,只要慢慢看,还是能理解的。

七.小结

deque是两头都能操作的线性连续空间,它的线性连续空间是建立在多段连续空间的基础上的,为了管理多段连续空间,deque设计了中控器map,deque的迭代器也经过精心设计,数据结构中最主要的就是维护deque的多段连续空间,元素操作中最主要的是空间的管理(这一部分用的是deque的构造和空间管理)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值