1.value type
一般的,每个iterator都会有至少一个associatedtype,我们将iterator指向对象的类型称为value type。
那么我们应该怎样取得iterator的value type呢?对于某个iterator,我们可以通过模板指定其valuetype,但是这是这个value type和iterator是分离的,对于对个不同算法,操作起来十分不便。
那我们考虑是否可以在Iteratorclass 声明其value type呢?比如:
template<class T>
struct Iterator{
typedefT value_type;
};
那么可以将Iterator的value type写成 typenameIterator::value_type;
但是这类Iterator是一个class,那么对于non-class类型的Iterator,比如int*,应该怎么怎么做呢?考虑到C++template的特化特性,我们可以写成如下形式:
template<classT>
struct iterator_traits<T*>{
typedef T value_type;
};
对于const类型的可以写成:
template<classT>
struct iterator_traits<const T*>{
typedef T value_type;
};
对于int*,我们就可以用iterator_traits<int*>::value_type;
为了保持三种Iterator的一致性,对于class类型的Iterator,可以再向上封装一层。
struct iterator_traits<Iterator>{
typedef typename Iterator::value_type value_type;
};
2.difference type
对于Random AccessIterator来说,不可避免要表示两个Iterator之间的距离,比如对于指针型的Iterator,有p2-p1的运算,那么其结果是什么类型呢?
我们知道,对于指针型的Iterator,指针相减的类型为ptrdiff_t,其为32位,最大表示值为2^31-1,那么对于一些Iterator,其值超出这个最大值怎么办?
其实,我们可以采用value_type一样的机制,把differncetype定义为的Iterator class的嵌套类别,并加入iterator_traits中。
一个使用differnce type的例子:
template<class Iterator, class T>
iterator_traits<Iterator>::difference_type
count(Iteratorfirst, Iterator last, const T& x){
iterator_traits<Iterator>::difference_typen = 0;
while(first!=last){
if(*first == x)
++n;
++first;
}
return n;
}
3.reference type和point type
如果p是一个mutableiterator,则*p类型为T&;如果p是一个const iterator,则*p类型为const T&,一般而言,*p的类型并不是p的value type,而是p的reference type;
Point type同理;