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);

    }

  • 相关阅读:
    opencvadd加法
    opencvcopyMakeBorder拓展边界
    opencvcountNonZero计算非0值个数
    opencvcompare比较
    opencvputText绘字
    opencvaddWeighted加法
    opencvconvertScaleAbs位深转化函数
    opencvsplit分离通道
    软件测试的人际关系(转载)
    Struts 1.3.10 jar包官网下载地址
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983174.html
Copyright © 2011-2022 走看看