STL(11) deque stack queue

发布时间 2023-09-15 00:13:41作者: LiviaYu


容器deque,双向开口的queue

容器结构的表示
是一种分段连续的假象,当需要分配的时候,向前面再分配一个buffer

迭代器的构造如图,node是指向存储各个分段的位置,当++ --时,要返回这个控制中心来查找

first指向当前buffer的首地址 last指向尾地址,cur指向当前地址

cur指向last或者first时,要返回控制中心来查找下一个buffer的地址

源码 G2.9

map为什么是T** 指向的空间中是指向buffer的指针,所以是指向指针的指针,占用空间 4bytes

map_size 大小也为4

iterator内部包含4个指针,迭代器大小是16

所以一个deque的sizeof是40

buffersize的自定大小

gnu2.9允许指定buffer大小

如果传入的n不等于0,那么buffersize就是传入的n的大小

如果n=0,那么由容器自行分配每个buffersize的大小,如果这个sizeof(value_type)<512 传回512/sizeof

如果sizeof>=512 传回1

insert

当插入一个元素,并且在两端,那么就直接插入元素

当这个元素不在两端,就需要去将左右两边的元素向外推,具体推哪边,需要哪边的元素较少,以此获得更小的开销

模拟连续空间

需要迭代器进行运算:检查边界,进入另一个buffer

front返回start所指的东西

finish指向最后一个元素之后,所以back返回finish前一个指的东西

size 是返回finish-start显然,迭代器对于此操作符进行重载

-的重载

两个迭代器之间的距离如何计算:

  1. 首先获得buffersize,以此得知buffer有多大,方便计算
  2. 获得首尾buffer之间的数量,乘上buffersize就知道之间的完整的buffer中有多少个元素
  3. cur-first获得当前buffer中,前面有多少个元素
  4. x.last-x.cur获得起点buffer中,有多少元素

++--重载

移动到了最后,就要寻找下一个buffer(last指向一个buffer的最后一个元素的下一个位置)

+=重载

-=同样使用+=的代码

gnu c 4.9

不再允许指定buffersize

queue

queue可以使用deque的代码并且禁用某些功能

因此,一般来说queue并不是标准的容器,而是适配器,将别人改装后变成自己的

stack

同理

其他的底层结构