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

deque

{

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

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

以map作为主控;

//map

{

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

缓存区是deque的储存主体;

}

//class

{

>

class deque

{

typedef T           value_type;

typedef value_type* pointer;

map_pointer map;       //指向map,map时块连续空间
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)

{

? n : (sz < ? size_t(/sz)
: size_t());

}

//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+6=17;

分析:

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;

*/

) +

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

}

stl源码剖析 详细学习笔记deque(1)的更多相关文章

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

    protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...

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

    //---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(c ...

  3. stl源码剖析 详细学习笔记 hashtable

    //---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成h ...

  4. stl源码剖析 详细学习笔记 set map

    // //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03 ...

  5. stl源码剖析 详细学习笔记 RB_tree (1)

    // //  RB_tree_STL.cpp //  笔记 // //  Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...

  6. stl源码剖析 详细学习笔记priority_queue slist

    // //  priority_queue.cpp //  笔记 // //  Created by fam on 15/3/16. // // //------------------------- ...

  7. stl源码剖析 详细学习笔记heap

    // //  heap.cpp //  笔记 // //  Created by fam on 15/3/15. // // //---------------------------15/03/15 ...

  8. stl源码剖析 详细学习笔记stack queue

    // //  stack.cpp //  笔记 // //  Created by fam on 15/3/15. // // //---------------------------15/03/1 ...

  9. stl源码剖析 详细学习笔记 空间配置器

    //---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...

随机推荐

  1. Azure 中的虚拟网络和虚拟机

    创建 Azure 虚拟机 (VM) 时,必须创建虚拟网络 (VNet) 或使用现有的 VNet. 此外,还需要确定如何在 VNet 上访问 VM. 在创建资源之前必须做好规划,确保了解网络资源的限制. ...

  2. svn Please execute the 'Cleanup' command. 问题解决

    1由于使用svn 更新文件出错,导致svn中断,然后就一直循环出现  ‘’Please execute the 'Cleanup' command‘’ 问题: 查找网上方案 . 有使用sqlite3 ...

  3. ASP.NET获取服务器信息大全

    p>服务器IP:<%=Request.ServerVariables["LOCAL_ADDR"]%></p> <p>服务器名:<%= ...

  4. kettle 启动spoon一闪而过

    Kettle是Pentaho的一个组件,主要用于数据库间的数据迁移(ETL). Kettle有三个主要组件:Spoon,Kitchen,Pan.其中Spoon是一个图形化的界面. 一.安装kettle ...

  5. [luogu T71973]卡常者π酱

    [luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...

  6. Mojave使用pyenv安装python-zlib错误

    mojave使用pyenv编译python出现 zipimport.ZipImportError: can't decompress data; zlib not available错误 解决方案: ...

  7. SDN2017 第四次实验作业

    实验目的 1.使用图形化界面搭建拓扑如下并连接控制器 2.使用python脚本搭建拓扑如下并通过命令行连接控制器 3.使用任一种方法搭建拓扑连接控制器后下发流表 实验步骤 建立以下拓扑,并连接上ODL ...

  8. Python代码小片段

    1.前面变量值的改变不影响后面变量的调用 index=1 index,a=2,index+1 print(a,index) #2 2 2.类的继承(子类实例如何调用父类同名方法) class a: d ...

  9. Oracle Database(rdbms) 12.2 安装组件

    1. 工具用法 su - oracle $ $(orabasehome)/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl Usage: catcon ...

  10. win10管理员已阻止你运行此应用”解决方法

    方法/步骤 1 按WIN+R键,打开“运行”,然后输入“gpedit.msc",就是打开组策略,这个在控制面板中也可以打开. 2 在组策略里找到“计算机配置”-“Windows设置”-“安全 ...