1.迭代器的概念
迭代器是一种抽象的设计概念。在设计模式中,迭代器模式定义为:提供一种方法,使之能够依序访问某个容器中所含的各个元素,而又无需暴露该容器的内部组织结构。
迭代器可以看做一种行为类似指针的对象,迭代器和指针一样都具有解引用和成员访问的功能。
2.迭代器的相关类型
通常在使用迭代器时需要使用迭代器所指的对象的类型或者迭代器所指对象的类型的指针类型或者引用类型等,这些通常称为迭代器相关类型。
在SGI-STL中,通常约定在每一种迭代器类型中内嵌定义该迭代器的相关类型,以便在以后需要时获取该迭代器的相关类型。
3.SGI-STL中迭代器的相关类型
在SGI-STL中迭代器定义了5种相关类型,如下:
value type
different type
pointer type
reference type
iterator_category
(1)value type、point type、reference type与迭代器所指的对象有关,分别为迭代器所指对象的类型,指向该对象的指针的类型,该对象的引用类型
(2)different type用来表示指向该对象的指针的算术运算的值类型
(3)iterator_category表示该迭代器所属的类别。
4.迭代器的分类与从属关系
(1)迭代器分类
在SGI-STL中,根据可以对迭代器进行的算术操作(迭代器的移动特性)与对该迭代器所指对象进行的操作对迭代器分为五类:
<1> Input Iterator: 迭代器只能自增向前移动,单趟移动;迭代器所指对象只能读(read-only),不能写
<2> Output Iterator: 迭代器只能自增向前移动,单趟移动;迭代器所指的对象只能写(write-only),不能读
<3> Forward Iterator:迭代器只能自增向前移动,多趟移动; 允许对该迭代器所指对象进行读写操作
<4> Bidirectional Iteator:迭代器可以自增和自减双向移动,多趟移动;可以对迭代器所指对象进行读写操作
<5> Random Access Iterator:迭代器允许所有可以对指针进行的算术运算,多趟移动;可以对该迭代器所指的对象进行读写操作
(2)迭代器从属关系
从迭代器的分类可以看出迭代器之间存在从属关系,比如:Forward Iterator可以看做Input Iterator的一种,其具有Input Iterator可以进行的所有操作,可以看做类之间的
is-a关系,所以在SGI-STL中使用类的继承来表示迭代器之间的从属关系;
struct input_iterator_tag { }; struct output_iterator_tag { }; struct forward_iterator_tag : public input_iterator_tag { }; struct bidirectional_iterator_tag : public forward_iterator_tag { }; struct random_access_iterator_tag : public bidirectional_iterator_tag { };
5.SGI-STL算法对于迭代器类型的命名规则
SGI-STL中规定:泛型算法中以该算法可以接受的最低阶的迭代器类型为该算法中的迭代器类型参数命名。
迭代器的类型是以类实现的,从属关系体现在类继承上;通过继承机制,可以接受某个基类对象的地方应该也可以接受该基类的派生类对象,然而可以接受某个基类派生类对象的地方不可以接受该基类对象,从而可以接受Input Iterator的算法也可以接受Forward Iterator等该迭代器类型类的派生类。
6.迭代器相关类型萃取
在SGI-STL中提供了一种机制用于萃取迭代器的相关类型。当需要获取一个迭代器的相关类型时使用迭代器萃取机制即可获取迭代器的相关类型。
迭代器的萃取机制使用模板实现,并使用偏特化对指针类型,const 指针类型进行特殊处理。
template <typename Iterator> struct iterator_traits { typedef typename Iterator::iterator_category iterator_category; typedef typename Iterator::value_type value_type; typedef typename Iterator::difference_type difference_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; };
7.容器、迭代器、算法的关系
在SGI-STL中,设计迭代器类是需要考虑相应的该迭代器的相关类型;
设计容器的迭代器时,设计适当的迭代器是容器需要考虑的问题,每个容器的迭代器类设计不同,只有容器才知道如何来遍历访问容器中所有的元素,并且执行容器的迭代器可以执行的相关操作(前进或者后退,可以对迭代器所指对象的读写操作);
算法以迭代器为接口,而不考虑各个容器的迭代器在具体实现上的差别;