双端队列deque的初始化和扩容

一、双端队列的结构

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 -->
        */
原文地址:https://www.cnblogs.com/-citywall123/p/13444853.html