STL源码剖析总结_第三章-迭代器与traits编程技法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.迭代器(iterators)概念与traits编程技法
STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后在以一贴胶着剂将它们撮合在一起。
3.1 迭代器设计思维——STL关键所在
STL中心思想:将数据容器和算法分开,彼此独立设计,最后再以已贴粘着剂将他们撮合在一起
3.2 迭代器是一种smart pointer
迭代器是一种行为类似指针的对象,指针的最常见最重要的是内容提领(取出指标所指物体的内容dereference)和成员访问(member access)。所以,迭代器最重要的编程工作是对operator *和operator->进行重载(overloading)工作。
auto_ptr 是一个用来包装原生指针的对象,内存漏洞问题可以借此解决。用法如下,和原生指针一模一样。
3.3 迭代器相应类别(associated types)
最常用的相应类别有五种
value type:迭代器所指对象的型别。
difference type :表示两个迭代器之间的距离,可用于表示容器的最大容量。pointer type:代表迭代器所指对象的指针类型。简言之,operator->()的返回类型。reference type:代表迭代器所指对象的引用类型。简言之,operator*()的返回类型。分为两种,不允许改变“所指对象之内容”者称为constant iterators,例如const int* pic,允许改变“所指对象之内容”者称为mutable iterators,例如int* pi。*pic/*pi的型别constant T&/T&就是reference type。
iterator category type:提出5种迭代器的类型标识。
使用函数模板的参数推导机制
推导的是参数,无法推导函数的返回值类型
3.4 traits编程技法——STL源代码门钥
1)参数类别推导技巧虽然可以用于value type,但非全面可用:value type 用于
函数的传回值
声明内嵌型别
关键词typename 的用意在于告诉编译器这是个型别
隐晦的陷阱:并不是所有的迭代器都是class type,如果不是class type 就无法为他定义内嵌类别
partial specialization(偏特化)的意义
2)Iterator category
Input Iterator:不允许外界改变。只读。
Output Iterator:唯写(write only)
Forward Iterator: 允许写入型算法(例如replace())在此种迭代器所形成的区间上进行读写操作。
Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间(例如逆向拷贝某范围内的元素)
Random Access Iterator: 前四种迭代器都只供应一部分指针算术能力(前三种
支持operator++,第四种再加上operator--),第五种则涵盖所有指针的算术能
力,包括p+n,p-n,p1-p2,p1 注意:STL算法的一个命名规则:以算法所能接受的最低阶迭代器类型来为其迭代器型别参数命名