容器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显然,迭代器对于此操作符进行重载
-的重载
两个迭代器之间的距离如何计算:
- 首先获得buffersize,以此得知buffer有多大,方便计算
- 获得首尾buffer之间的数量,乘上buffersize就知道之间的完整的buffer中有多少个元素
- cur-first获得当前buffer中,前面有多少个元素
- x.last-x.cur获得起点buffer中,有多少元素
++--重载
移动到了最后,就要寻找下一个buffer(last指向一个buffer的最后一个元素的下一个位置)
+=重载
-=同样使用+=的代码
gnu c 4.9
不再允许指定buffersize
queue
queue可以使用deque的代码并且禁用某些功能
因此,一般来说queue并不是标准的容器,而是适配器,将别人改装后变成自己的
stack
同理