deque双向队列,可在头尾插入和删除。
存储方式:在内存中分段连续。
其iterator的功劳:当迭代器指到一个buffer的边界时会进行判断,有能力跳入下一个或者前一个buffer,形成连续的假象(模拟连续储存)。
GNU2.9 中deque模板含三个参数,允许指定buffer大小(GNU4.53以后不再允许)
第三个参数为缓冲区大小,默认值为0表示使用预设值,若为n(n!=0)则表示每个buffer内能放n个元素。预设值为512byte,每个buffer能放元素的个数为: 512/sizeof(value_type)
一个deque内含有4个数据
两个iterator类型的迭代器分别指向头和尾。map
指向一个vector,这vector是deque的控制中心,其中每一个元素(node)指向一个buffer,buffer内存放deque的真正元素。map_size是这个控制中心vector的size。
这个vector每次2倍扩容时与一般vector的区别:map所指的实现控制中心的vector每次扩容时将数据拷贝至新vector的中间,以便前后都可以添加元素。
sizeof()一个daque: 4*4+4*4+4+4=40
deque的iterator类
iterator内含有4个数据,都是指针
cur是迭代器实际所指的deque中的元素。
first和last指向当前数据所在buffer的首尾。
node指向当前数据在控制中心中所属的元素。
一个deque类的构成:
deque,stack,queue之间的联系:
queue和stack实现方法都是内含有一个deque作为底层结构,然后只使用其部分功能,并没有自己特殊的结构。
queue和stack也称为容器适配器(container adapter)
stack和queue都不允许遍历,也不提供迭代器。(他们和其他容器的区别在于有特殊的数据顺序规则,先进先出和先进后出,如果允许迭代器遍历会扰乱这种规则)