STL之deque实现详解_一个菜鸟的博客-CSDN博客_stl deque https://blog.csdn.net/u010710458/article/details/79540505
双端队列 /dek/
由多个缓冲区组成,由map控制,node到了一个buffer的尾部后,就指向下一个buffer的头
buffer 或者 称为 node
deque是分段连续。
对外号称连续(显现出来的特性),实际不然。
迭代器的node指向map,一个控制中心,是一个vector,里面的元素是指向各个buffer的指针。
迭代器的cur指向当前位置,first指向真 头,last指向真 尾(尾后?)
迭代器的node指向的当前的buffer
源码
sizeof(deque)是多少呢?(32位系统) start 16 finish 16 map 4 map_size(无符号整形数)4
所以sum=40 (64位系统则为80个字节大小)
insert
往哪里插入比较快,当然是元素少的地方,所以插入会比较前后距离
*和->的重载
迭代器之间的距离
++ – 重载
后++ 调用 前++
后-- 调用 前–
注:
operator++(int ) 表示前++,即i++ 返回旧值
operator++() 表示后++ 即++1 返回新值
+和+=重载
为什么这里下标运算符不返回引用呢?这样不就不能更改值了么?
后续版本
更复杂,都设计成4个class:
新版本不再允许指定第三个参数bufferSzie
总结
stack 和 queue
queue是内部包含一个deque,访问权限是protected
stack也一样,都是转调用。
stack和queue不能遍历,不提供迭代器
底层容器的选择:
stack和queue都可以选择list或者deque做底层容器。默认的deque速度更快。
stack可选vector,queue不可以,因为queue先进先出,而vector不提供这样的pop_front方法。
试想提供的话,每次pop_front都要把全部元素向前移动,代价太大。
不能选择set和map做底层容器
小结
内存模型:
deque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。