deque源码解读

deque概述vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的安插和删除动作。vector当然也可以在头尾两端做动作,但是其头部动作效率奇差,无法被接受。deque和vector的最大差异,一在于deque允许在常数时间内对头尾端进行元素的安插或移除动作。二在于deque没有所有容量概念,因为它是动态地以分段连...
摘要由CSDN通过智能技术生成

deque概述

 vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的安插和删除动作。vector当然也可以在头尾两端做动作,但是其头部动作效率奇差,无法被接受。

deque和vector的最大差异,一在于deque允许在常数时间内对头尾端进行元素的安插或移除动作。二在于deque没有所有容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。

虽然deque也提供Ramdon Access Iterator,但它的迭代器并不是原生指标,其复杂度和vector不可以并论,这当然在影响了各个运算层面。因此,除非必要,我们应尽量选择使用vector而非deque。

deque的中控器

deque是连续空间,连续线性空间总令我们联想到array或vector。array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓成长原是个假象,事实上是(1)另寻找更大空间,(2)将原数据复制过去,(3)释放原来空间三部曲。如果不是vector每次配置新空间都留下一些富裕,其成长假象所带来的代价是相当高贵。

deque是由一段一段的定量连续空间构成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的界面。避开了“重新配置,复制,释放”的轮回,代价则是复杂的迭代器架构。

受到分段连续线性空间的字面影响,我们可能以为deque的操作复杂度和vector相差不多。其实不是这样,虽然是分段连续线性空间,就必须有中央控制,而为了维护整体连续的假象,数据结构的设计及迭代器前进后退等动作颇为繁琐。deque的操作代码量远比vector或list都多得多。这也就是deque最主要的缺点。

deque采用一块所谓的map,(不是STL的map容器)作为主控。这里所谓map是一小段连续空间,其中每个元素(此处称为一个节点,node)都是指标,指向另一段较大的连续线性空间,称为缓冲区。缓冲区才是deque的存储空间主体。SGI STL允许我们制定缓冲区大小,默认值0表示将使用512bytes缓存区。

map是块连续空间,其内的每个元素都是一个指针(称为节点),指向一块缓冲区;map其实就是一个T**,也就是它是一个指针,所指之物又是一个指针,指向型别为T的一块空间,如下图所示。

 

deque的迭代器

 deque是分段连续空间。维护其整体连续假象的任务,这就落在迭代器的operator++和operator--两个运算子上。

deque迭代器应该具备什么结构。首先,他必须能够指出分段连续空间(亦即缓冲区)在哪里,其次他必须能够判断自己是否已经处于其所在缓冲区的边缘,如果是,一旦前进或后退时必须跳跃至下一个或上一个缓存区。为了能够正确跳跃,deque必须随时掌握管控中心(map)。

所以迭代器在前进和后退时就需要判断是否为当前缓冲区的最后一个元素或者是第一

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值