1、相关
iterator.h文件其实并不涉及具体的哪一个容器的迭代器,只是定义了一些统一的标准,比如迭代器相应的型别,比如一个算法需要用到迭代器所指对象的型别,而怎么获得型别在前面traits编程已经说过。根据经验,最常用到的迭代器的型别有五种,value type,difference type,pointer,reference,iterator catagoly。
value type:是指迭代器所指对象的型别。
difference type:用来表示两个迭代器之间的距离,因此它也可以用来表示一个容器的最大容量,因为对于一个连续空间的容器而言,头尾之间的距离就是其最大容量。
reference type:从迭代器所指之物的内容是否允许改变角度来看,迭代器分为两种:不允许改变所指对象的内容,称为constant iterator,例如:const int *pic。允许改变所指对象内容,称为mutable iterator,例如:int*pi。当对一个mutable iterator进行提领时,获得的不应该是一个右值,因为右值不允许赋值。在C++中,函数如果要传回左值,都是以by reference的方式进行的。
pointer type :pointer和reference在C++中有非常密切的关联,如果传回一个左值,令它代表所指之物是可能的,那么传回一个左值,令它代表所指之物的地址也一定可以,也就是说可以返回一个指针,指向迭代器所指之物。
iterator catagoly:最后一个迭代器型别会引发大规模的代码工程。在讨论这个型别之前先讨论迭代器的分类:
// 五种迭代器类型
//这种迭代器所指的对象不允许外界改变,只读
struct input_iterator_tag {};
//唯写
struct output_iterator_tag {};
//允许写入型算法,如replace()在此种迭代器区间上进行读写
struct forward_iterator_tag : public input_iterator_tag {};
//可双向移动,某些算法要求
struct bidirectional_iterator_tag : public forward_iterator_tag {};
//前四种迭代器只供应一部分指针算术运算,前三种支持operator++,第四种再加上operator--。
//第五种全都支持,
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
设计算法时,如果可能尽量针对每种迭代器提供一个明确定义并针对更强化的某种迭代器提供另一种定义,这样才能在不同情况下提供最大效率。
iterator class不含有任何成员,只是纯粹定义型别,所以继承它不会产生任何负担ÿ