//---------------------------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;;}//两个;是手误??

}

最新文章

  1. CSS3媒体查询使用小结
  2. 【转载】latch: cache buffers chains
  3. tp框架之增删改查
  4. 【Learning Python】【第三章】表、元组、字典和集合
  5. HDU 1285 确定比赛名次 拓扑排序模板题
  6. 杨辉三角用java实现
  7. 利用jquery来进行表单的多向提交
  8. 轻量级应用开发之(01)第一个IOS程序
  9. Linux centos关机与重启命令详解与实战
  10. FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具(转)
  11. SQL2008-c:\PROGRA~1\COMMON~1\System\OLEDB~1\oledb32.dll出错找不到指定的模块
  12. mybatis于Date和DateTime现场插入
  13. 8.PHP 教程_PHP字符串
  14. InsertOnSubmit、InsertAllOnSubmit等区别 (转)
  15. WPF学习(1)WPF概述
  16. 【转】Android Application 对象介绍
  17. 第5章Zabbix自动化监控
  18. 微信小程序登录流程及解析用户openid session_key,获取用户信息
  19. filter与map函数
  20. C++笔记整理(参考整理自各大博客)

热门文章

  1. sql 经典面试题及答案(选课表)
  2. MySQL索引原理及慢查询优化-zz
  3. mysql 5.5 数据库 utf8改utf8mb4
  4. 在TortoiseSVN使用clean up
  5. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)
  6. SQL一字段内的字符串按照特定字符串转化为多行显示
  7. 7.Solr查询参数
  8. git 的一般使用
  9. 编程算法 - 左旋转字符串 代码(C)
  10. 用ASP.NET Web API技术开发HTTP接口