deque底层实现\栈与队列的实现——STL源码剖析阅读笔记

deque是一种双向开口的连续线性空间,其内部由多个分段连续空间组成。与vector不同,deque允许常数时间内在头部进行插入和移除。deque的push_back操作涉及缓冲区管理和空间分配,而clear操作后会保留一个空缓冲区。insert操作会根据插入位置调整元素。stack和queue是基于deque实现的容器适配器,分别实现先进后出和先进先出的行为。
摘要由CSDN通过智能技术生成

deque是一种双向开口的连续线性空间

deque与vector的差别:

  1. deque允许常数时间内对头部进行插入和移除操作
  2. deque没有容量的概念,它是由多个分段连续空间组合而成的,可以随时增加一段新空间并链接起来

deque的数据结构

  • deque采用了一块map作为主控,map上的每个元素都是一个指向一段线性连续空间的指针,除此之外,deque还维护了 startfinish 两个迭代器,分别指向第一个缓冲区的第一个元素和最后一个缓冲区的最后一个元素。
  • deque的每个缓冲区都有三个迭代器,firstlastcur,分别指向缓冲区的头部、尾部和当前所在元素,缓冲区内部的操作将由这三个迭代器来完成。

deque的push_back操作

deque的结构相比vector要复杂不少,所以它的添加和删除操作也会变得复杂,这里以push_back()操作举例:
当我们在尾端添加一个元素的时候,它首先会判断 最后缓冲区是否有两个以上的元素备用空间 (头部则是会判断没有备用空间),如果有两个以上备用空间,那么我们可以直接讲元素放入缓冲区,但是若是没有,则会触发push_back_aux()函数。这个函数首先会判断 尾端的节点备用空间 ,如果不足,就会计算是否有足够的空间来配置新节点,它会判断 map的大小是否大于增加节点后大小的二倍,这将会决定map是否要重新配置一块新的空间给map使用。
在做好上面的操作以后,函数会配置一个新的节点,并将元素放入对应的缓冲区,改变finish的状态。

deque的clear操作

与其他的容器一样,deque也有clear()函数用来清除整个deque,但deque的最初状态会保有一个缓冲区,也就是说即使我们使用了clear()方法,deque一样会保留一个缓冲区

deque的insert操作

insert()函数可以支持我们在某一个位置插入一个值,但要注意的是,在某一个位置插入值的时候,函数会判断插入点前和插入点后的元素个数。当插入点前的元素个数比较少的时候,会在头部重新加入一个头部元素,然后将元素向前移动,反之,则会将尾端元素向后移动,最后在目标点插入新值。

stack与queue

stack(栈)是一种先进后出的数据结构,queue(队列)是一种先进先出的数据结构,在STL中,两者的底层结构都是基于deque实现的,它们是修改了deque的接口形成的,被称之为container adapter(容器配接器),而不是container(容器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值