3.迭代器(iterators)概念与traits编程技法
STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后在以一贴胶着剂将它们撮合在一起。
3.1 迭代器设计思维——STL关键所在
STL中心思想:将数据容器和算法分开,彼此独立设计,最后再以已贴粘着剂将他们撮合在一起
3.2 迭代器是一种smart pointer
迭代器是一种行为类似指针的对象,指针的最常见最重要的是内容提领(取出指标所指物体的内容dereference)和成员访问(member access)。所以,迭代器最重要的编程工作是对operator *和operator->进行重载(overloading)工作。
auto_ptr 是一个用来包装原生指针的对象,内存漏洞问题可以借此解决。用法如下,和原生指针一模一样。
![](https://img.haomeiwen.com/i11669970/9ecc431e7e2e62fb.png)
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源代码门钥
参数类别推导技巧虽然可以用于value type,但非全面可用:value type 用于函数的传回值
声明内嵌型别
关键词typename 的用意在于告诉编译器这是个型别
隐晦的陷阱:并不是所有的迭代器都是class type,如果不是class type 就无法为他定义内嵌类别
partial specialization(偏特化)的意义
![](https://img.haomeiwen.com/i11669970/b86291dfd00701e7.png)
![](https://img.haomeiwen.com/i11669970/6768e451f55909dd.png)
![](https://img.haomeiwen.com/i11669970/316fe850b62a8147.png)
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算法的一个命名规则:以算法所能接受的最低阶迭代器类型来为其迭代器型别参数命名
![](https://img.haomeiwen.com/i11669970/58cb57eaa29931cb.png)
网友评论