//--------------------------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. c#WebApi使用form表单提交excel,实现批量写入数据库

    思路:用户点击下载模板按钮,获取到excel模板,然后向里面填写数据保存.from表单提交的时候选择保存好的excel,实现数据的批量导入过程 先把模板放在服务器的项目目录下面:如 模板我一般放在:F ...

  2. Oracle EBS INV更新保留

    CREATE or REPPLACE PROCEDURE UpdateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...

  3. SQL Server 从2000复制数据到2008及以上版本的一种方法

    1.通过Linked Servers 执行sql出现错误提示,无法执行复制数据操作. sql: insert into tb_User select from [**.**.*.**].DB.dbo. ...

  4. 转:queue

    数据结构C#版笔记--队列(Quene)   队列(Quene)的特征就是“先进先出”,队列把所有操作限制在"只能在线性结构的两端"进行,更具体一点:添加元素必须在线性表尾部进行, ...

  5. rename 批量修改文件名简单用法

    有的时候我们需要批量创建文件做测试,为了做区分,一般只要稍稍动动文件名即可,MV命令既可以移动文件,也是可以修改文件名的,但批量修改文件名MV做不到,此时,我们可以用rename命令批量修改是蛮不错的 ...

  6. 在eclipse中方便的比较各个语言 资源文件—jinto的安装

    一.下载与安装jinto Eclipse插件的插件,用来解决资源文件的国际化问题 用jinto编辑器打开properties文件后,就可以方便的建立出各国和各种语言的资源文件,同时可以方便的对比书写各 ...

  7. 嵌入式开发板LInux更新系统、安装软件、下载资源碰到的问题

    CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 先同步系统时间 shell 输入命令 date 如果显示的时间跟你本地时间不一样,先设 ...

  8. 团队作业——Alpha冲刺 1/12

    团队作业--Alpha冲刺 Alpha 阶段认领的任务 杨光海天:加入随心摘首页和编辑界面的开发中,并完成冲刺博文的撰写 郭剑南.周琪文:图像识别核心算法的实现 赖志平:随心摘首页和编辑界面开发主力, ...

  9. Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  10. Grunt-jsdoc生成JS API文档

    Grunt-jsdoc生成JS API文档 具体的请看官网 https://github.com/krampstudio/grunt-jsdoc 一:首先确保本机电脑上是否已经安装了nodejs和np ...