迭代器类似于指针的对象,内中管理着元素指针,对于*、->、++、--等操作符进行重载,管理着对象的创建和删除。
对于迭代器的使用的时候需要相对应的型别,所以利用traits技法,来获取型别定义对象。
traits就是特性萃取机,定义一个iterator_traits类,在类中使用typedef对于模板中的参数进行重命名,这样我们就能获取传递的参数的型别,对于特定的类型如原始指针,我们可以特化一个版本的模板。
5中常用的型别:value_type、difference_type、pointer、reference、iterator_category。
1、value_type:迭代器所指对象的型别。
2、difference_type:表示两个迭代器之间的距离。
3、reference:传递一个对象,令其代表迭代器所指对象,返回的型别就是T&
4、pointer:传递一个对象,令其代表迭代器所指对象的地址,返回类型为T*
5、iterator_category:迭代器有5类,Output_iterator(只写)、Input_iterator(只读)、Forward_iterator(区间读写)、Bidirectional_iterator(双向移动区间读写)、Random_Access_iterator(包含指针所有操作)。对于当前类继承前一个类除了Input_iterator。
对于一个函数,获取迭代器类型,调用一个新的函数,将迭代器类型当参数,利用函数重载使用对应的新的函数。
对于每个函数模板参数名要使用最底层的类型,因为子类的迭代器可以使用父类的函数,因为子类的权限包含父类的权限,使用类的继承消除了传递调用的函数。