一、双端队列的结构
deque的结构是由两个数组组成的,暂且把这两个数组称作是1号数组和2号数组(Array_1、Array_2)
1号数组保存的是指向2号数组的指针,1号数组的初始大小为2,在2号数组满的时候进行2倍扩容,初始化1号数组中间位置的指针指向2号数组Array_1[size/2]=Array_2;
2号数组保存的是deque的内容,2号数组有两个指针,first和last,我们打这两称作头指针和尾指针,deque的push_front()和push_back()就是对这两个指针进行操作
first指针和last指针初始化的时候在2号数组的中间位置,*first=Array_2[max_size/2],*last=*(first+1);
Array_2数组的大小max_size取决于deque保存的数据类型sizeof(T)的大小,如果sizeof(T)>4096 max_size=1;否则max_size=4096/sizeof(T)
初始化之后的结构
/* <-- first Array_1[0] | | Array_1[1] | - - - - - - - - - - - Array_2 | last --> */
二、deque的扩容
首先deque是采取二倍扩容机制,并且是对1号数组Array_1进行扩容,扩容之后还是从数组中间位置开始使用,有以下几种情况需要对1号数组进行扩容
假设1号数组的大小为size_1
1、first指针移动到Array_2的头部位置,first指针所在的Array_2数组对应1号数组的下标i==0,last指针所在的Array_2对应的1号数组下标 j+1<size_1,这时候需要对Array_1进行2倍扩容
/* <-- first | Array_1[0] | - - - - - - - - - - - Array_2_1 Array_1[1] | - - - - - - - - - - - Array_2_0 | last --> */
2、last指针移动到Array_2的尾部位置,last指针所在的Array_2数组对应1号数组的下标i==size_1-1,first指针所在的Array_2对应的1号数组下标 j==0,这时候需要对Array_1进行2倍扩容
/* <-- first | Array_1[0] | - - - - - Array_2_1 Array_1[1] | - - - - - - - - - - - Array_2_0 | last --> */
当first指针或last指针指到Array_2数组的边界位置,可以通过整体向上或向下移动腾出空间,那么可以不需要进行扩容
//整体向下移动一个位置,还是可以给first腾出一个位置的,所以可以不进行扩容 /* <-- first | Array_1[0] | - - - - - - - - - - - Array_2_2 Array_1[1] | - - - - - - - - - - - Array_2_1 Array_1[2] | - - - - - - - Array_2_0 | Array_1[3] | last --> */