stl源码剖析 详细学习笔记deque(1)


//--------------------------15/3/12----------------------------




deque

{

    

    deque没有容量(capacity)观念,是动态分段的,没有reserve(保留)功能;

   缓存区大小默认为0,表示有512bytes;

   map作为主控;

    //map

    {

        map是连续的空间,每个元素称为节点(node),都是一个指针,指向另一段连续的线性空间,称为缓存区;

       缓存区是deque的储存主体;

        

    }

    //class

    {

       template<class T,class Alloc=alloc,size_t BufSiz=0>

       class deque

        {

           typedef T           value_type;

           typedef value_type* pointer;

            map_pointer map;       //指向mapmap时块连续空间 map(T**)

            size_type map_size;    //map内克容纳多少指针

        };

    }

    //iteratoer

    {

       为了使deque看起来是连续的要重载++ --的运算符;

        // struct __deque_iterator

        {

            

           template<class T,class Ref,class Ptr,size_t BufSiz>

           struct __deque_iterator

            {   //未继承std::iterator(为什么)

               typedef __deque_iterator<T,T&,T*,BufSiz>    iterator;

               typedef __deque_iterator<T,const T&,const T*,BufSiz>    const_iterator;

               static size_t buffer_size(){return __deque_buf_size(BufSiz,sizeof(T));}

                

                

               typedef random_access_iterator_tag iterator_category;

               typedef T           value_type;

               typedef Ptr         pointer;

               typedef Ref         reference;

               typedef size_t      size_type;

               typedef ptrdiff_t   difference_type;

               typedef T**         map_pointer;

                

               typedef __deque_iterator self;//(为什么,仅仅是为了方便?)

                

                

                T* cur;    //缓存区中的现行(current)元素

                T* first;  //缓存区的头

                T* last;   //

                map_pointer node;//当前节点 T**

                

                

                

                

            }

           /*

             

                原书的说法是错的!!!!!!

             

                n==0 表示缓存区为系统默认大小,返回(512/sz)(sz大小的)缓存区

                (T<512 bytes, 512bytes==sz*(512/sz)),

                或者1(sizeof(T)大小的缓存区)(T>=512 bytes

                n!=0 表示用户要自定义缓存区大小,直接返回n(sizeof(T)大小)缓存区;

             

            */

           inline size_t __deque_buf_size(size_t n,size_t sz)

            {

               return n!=0 ? n : (sz <512 ? size_t(512/sz) : size_t(1));

            }

            

            //set_node用于跳过一个缓存区

           void set_node(map_pointer new_node)

            {

                node=new_node;     //把当前节点设置成new_node

                first=*new_node;   //把缓存区的头设置成*new_node

                last=first+difference_type (buffer_size());//尾部

            }

            referenceoperator*()const {return *cur;)}

            

            //取出的数据就是T( cur:{T*} -->> *cur:{T})

            pointeroperator->()const{return &(operator*());}

            //operator*():{T}-->>&(operator*()):{T*}

            difference_typeoperator-(const self& x)const

            {

               /*

                 例子:

                    假设‘/’表示一个node 假设一个缓存区有8‘#’也就是说buffer_size()8

                    node -> /////               ->      ####

                    (当前节点为第5个缓存区)   (cur指向第4个元素)

                    x   ->  ///                 ->      ###

                    (当前节点为第3个缓存区)   (cur指向第3个元素)

                    4号缓存区: 5-3-1=1得到一个完整的缓存区 -->> 8*1(T类型)x1*x2)

                    5号缓存区: 4-1=3 得到3(T类型) (x3)

                    3号缓存区: 9-3=6 得到6(T类型) (x4)

                    8+3+617;

                 分析:

                    x1=difference_type(buffer_size()) 为一个缓存区的个数(T类型)

                    x2=(node - x.node - 1) 为本对象的node节点-目标对象的node节点的个数(缓存区)1

                    x3=(cur - first) 为当前元素-这个缓存区第一个元素所得个数(T类型)

                    x4=(x.last - x.cur) 为目标对象node节点的最后元素-其当前元素所得的元素个数(T类型)

                    return value(假设有个返回值)==x1*x2+x3+x4;

                 

                 */

               return difference_type(buffer_size()) * (node - x.node -1) +

                (cur - first) + (x.last - x.cur);

}

原文地址:https://www.cnblogs.com/boydfd/p/4983174.html