zoukankan      html  css  js  c++  java
  • 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);

    }

  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983174.html
Copyright © 2011-2022 走看看