学stl iterator,traits笔记
一. iterator认识 【程序编程相关:微软即将在亚洲部分国家发布“视窗瘦身版”】
最近看侯杰老师的«stl源码剖析»有一点收获,特把我对stl iterator设计的认识草草记录下来,大部分内容来自那本书(看原书更好).欢迎大家跟我讨论,里面也有问题希望您能提供宝贵看法! 【推荐阅读:嵌入式系统的构建】
如果需要构造一组通用容器,提供一套统一的算法,构造底层数据结构类库,iterator的设计无疑是非常重要的.iterator可以方便容器元素的遍历,提供算法的统一参数接口.怎么说?首先,让我们考虑一个算法. 【扩展信息:设置端口映射使外网访问内网web】 template <class t> ptrdiff_t distance(t p1, t p2) { //计算p1与p2之间的距离 } 显然这个函数是想计算两个“位置”之间距离.这里表示“位置”的类型t,可以是指向数组中某个元素的(原生)指针,可以是指向链表节点的指针,也可以是用来记录位置的任何对象(例如我们要谈的iterator).不管这两个位置是对应在数组,vector,链表或是其他任何容器,我们当然希望设计好的类库中最好只要一个这样的distance函数,而不需要每种容器都有不同的“位置”记录方式,从而导致需要很多个这样的distance算法.对,我们完全可以抽象出一种表示“位置”的概念,它像游标,像智能的指针,可以方便的遍历容器中的元素,记录位置,而不用管你作用的是什么类型的容器,这就是现在被容器设计者普遍接受的iterator概念.二. stl iterator的设计:
为什么不用继承构造iterator? 容器抽象出5种iterator 类型,input<--forward<--bidrectional<--random access iterator加上output iterator,我们能不能通过refinement关系设计出具有继承关系的几个iterator类?然后各个容器的iterator类去继承这些基类.那么上面的disatance函数可以设计两个版本 ptrdiff_t distance(inputiterator p1, inputiterator p2) { //inputiterator只能一个一个前进,例如链表 ptrdiff_t n=0; while(p1 != p2) { ++p1; ++n; } return n; }ptrdiff_t distance(randomaccessiterator p1, randomaccessiterator p2)
{ //randomaccessiterator可以直接计算差距,例如数组,vector等 return p2-p1; }... 下一页