C++STL 学习 之 迭代器(iterators)

首先要明确迭代器是一个抽象的设计概念,是一种设计模式. Design Patterns 一书中对 Iterators模式的定义如下:提供一种方法,使之能够依序访问某个容器所包含的各个元素,而无需暴露该容器的内部表达方式,也就是说,Iterators的实现依赖于具体的容器,是针对某种容器特别设计的,只是对外提供一套统一的访问接口.
此外,STL的设计思想就是将数据容器和算法分离,彼此独立设计,最后用一种方式将他们粘合在一起,而Iterators便是这其间的粘合剂.从这个角度看,Iterators设计模式正好可以胜任该目标.

1.STL中 Iterators 的设计思路

迭代器本质是一种智能指针,是一种类似指针的对象,因此,对迭代器的设计主要是实现解引用()和成员访问(->),所以,主要的编程工作就是对operatorhe operator->进行重载

2.迭代器的相应型别(associated types)

迭代器的相应型别指的是迭代器所指之物的类型。
思考:假如要声明一个变量,该变量的类型是迭代器所指对象的类型,如何声明?解决办法:利用函数模板中的参数推导机制。

3. Traits(特性萃取)编程技巧

为了解决如何断定迭代器所指之物的类型问题,相应型别无法完美解决,引入Traits技巧
如何实现?
(1)首先,在类模板中声明一个内置类型:typedef T value_type
(2)针对原生指针,利用模板偏特化(对部分模板参数进一步限制)技术(因为原生指针无法定义内嵌类型)
(3)特性萃取实现:
template <class I>
struct iterator_traits {
typedef typename I::value_type value_type
}
偏特化实现:
template <class I>
struct iterator_traits<T*> {
typedef T value_type
}
(4)总结一下迭代器的实现:首先,对应的容器内部要实现一个内置类型,表示其存储对象的类型,这是一个约定;然后,针对迭代器不同的相应型别,利用Traits技术和偏特化技术(兼容)实现特性萃取结构体(间接封装一层,就是为了用偏特化兼容所有类型);最后,通过萃取结构体就可以萃取出迭代器所指之物的类型,达到目的。

4. 迭代器的五种主要相应型别(特性)

(1)value type:迭代器所指对象的类型
(2)difference type:用来表示两个迭代器之间的距离,因此可以用来表示一个迭代器的最大容量
(3)reference type:如果p是一个mutable Iterators,如果其value type为T,那么p的类型应该是T&,不应该是T(因为对于mutable变量返回的应该是左值而不是右值),同理,如果p是const Iterators,那么p类型应该为const T&
(4)pointer type:类似reference type,只不过指针类型指的是地址
(5)Iterator category:迭代器的种类类型
迭代器分类图

继承的作用:无论客户端传入哪种类型的迭代器,实际调用的都只是被继承(父类)的类型。
迭代器都可以继承它

posted @ 2019-06-06 15:19  Nolan24  Views(372)  Comments(0Edit  收藏  举报