//---------------------------15/3/13----------------------------

self&operator++()

{

++cur;

if(cur==last)

{

set_node(node+);

cur=first;

}

return *this;

}

self operator++(int)   //这里不能返回引用,因为
tmp是临时变量,作用域结束tmp就消失了

{

self tmp=*this;

++*this;

return tmp;

}

self&operator--()

{

if(cur=first)

{

set_node(node-);

cur=last;

}

--cur;

return *this;

}

selfoperator--(int)

{

self tmp=*this;

--*this;

return temp;

}

/*

1.看能否在不改变node的情况下进行指针位置的移动

2.调整node

offset==(n+x) -->>
最后的位置==first + (n + x)

x代表cur
距离first的距离,也就是cur当前的下标

(offset>0): offset/diffenrence_type(buffer_size())

-->>    y==(n + x)/(sz) -->>移动的node节点个数为y

(offset<0)   -difference_type((-offset -1) / buffer_size()) - 1

-->>    y==-(-n - x -1)/(sz) -1 -->> y==(n + x +1)/(sz) -1

不同于(offset<0)的情况,因为当前处于first位置,移动的距离在

-1到-(sz)是都应该移动一个node节点所以才取上式子;

3.调整cur

(offset>0) :offset==(n + x)

node_offset*difference_type(buffer_size())==(n + x -r)

(r代表余数)

-->>z(位移量)==r

(offset<0)  :offset==(n + x)

node_offset*difference_type(buffer_size())==(n + x +r-sz)

-->>z(位移量)==-sz + r

cur =z

*/

self&operator+=(difference_type n)

{

difference_type offset =n+(cur - first);

if(offset >=
&& offset < difference_type(buffer_size()))

cur+=n;

else

{

difference_type node_offset=

offset > ? offset/difference_type(buffer_size())

: -difference_type((-offset -) / buffer_size()) - ;

set_node(node + node_offset);

cur = first +(offset - node_offset * difference_type(buffer_size()));

}

return *this;

}

selfoperator+(difference_type n)
const

{

self tmp=*this;

return tmp+=n;

}

self &operator -=(difference_type n){return *this +=-n;}

selfoperator-(difference_type n)
const

{

self tmp =*this;

return tmp-=n;

}

referenceoperator[](difference_type)const{return *(*this
+n);}

bool
operator==(const  self& x)const{return cur==x.cur;}

bool
operator!=(const self& x)const {return !(*this==x);}

bool
operator<(const self& x)const

{

return (node==x.node)?(cur < x.cur) :(node < x.node);

}

>

class deque

{

public:

typedef T value_type;

typedef value_type* pointer;

typedef size_t size_type;

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

protected:

typedef pointer* map_pointer;

iteratoer start;

iteratoer finish;

map_pointer map;

size_type map_size;

public:

iteratoer begin(){return start;}

iteratoer end() {return finish;}

referenceoperator[](size_type n)

{

return start[difference_type(n)];

}

reference front(){return *start;}

reference back()

{

iteratoer tmp=finish;

--tmp;

return *tmp;

//上面三行不改为 return *(finish-1)是因为operator -(difference_type n)

//   
的操作比--复杂很多

}

size_type size()const {return finish - start;;}//两个;是手误??

}

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

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

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

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

    //--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的 ...

  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. 关于innodb mtr模块

    mtr (mini-transaction)微事务 mtr作用 mtr模块主要保证物理操作的一致性和原子性 1 一致性:通过读写锁来保证 2 原子性:涉及到的物理更新,都记入redo日志 mtr何时使 ...

  2. 光杆mdf文件的导入

    场景,准备学习SSAS的时候,按照教程在微软下载了示例数据库AdventureWorksDW2012,下载来才发现只有一个mdf文件. 正好今天群里有位兄弟也碰到差不多的问题,客户数据库里的ldf文件 ...

  3. jquery实现显示textarea输入字符数

    起初会想到使用keyup.keydown.keypress或者是onchange事件,onchange需要失去焦点才触发, 其它三个有些对按住键盘某个键不放不生效,有些对使用中文输入法正在输入时统计不 ...

  4. 第六次作业 orm整合 接口

    结合以前一个项目,将普通的jdbc进行了相关整合,全部改写成了hibernate接口 项目名称:短视频分享平台 主要功能:用户模块:注册.登录.编辑资料.查看用户相关 分类模块:分类添加.查看 视频共 ...

  5. Spring Boot 验证表单

    在实际工作中,得到数据后的第一步就是验证数据的正确性,如果存在录入上的问题,一般会通过注解校验,发现错误后返回给用户,但是对于逻辑上的错误,很难使用注解方式进行验证了,这个使用可以使用Spring所提 ...

  6. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  7. 8.1Solr API使用(分页,高亮)

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 一.Solr Deep Paging(深分页) 长期以来,我们一直有一个深分页问题.如果直接跳到很靠后的页数, ...

  8. 百度地图Key的设置方法

    一.为什么要设置百度Key 万能地图下载器提供了百度POI的下载功能,但由于本软件用户群极大,会导致一天之内访问量超出300万次以上而无法继续下载. 因此,当POI下载不成功能,用户可以自己申请百度地 ...

  9. elk平台定制化查询规则

    一.查询某IP在某时间内TOP10的请求 步骤: 点击“Visualize”选项卡 创建“Data table” 点击“From a new search” 下拉选择“F5-access” 在“buc ...

  10. 在Window下编译LibGeotiff(含Libtiff)

    核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...