Iterator的作用
Iterator是算法与容器的桥梁
举例说明std::rotate()
return std::__rotate(__first, __middle, __last,
std::__iterator_category(__first));
//iterator_category说明该迭代器的分类(增加或减少的性质)
__iterator_category(const _Iter&)
{ return typename iterator_traits<_Iter>::iterator_category(); }
//rotate更深入一层
__rotate(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
_RandomAccessIterator __last,
random_access_iterator_tag)
{
...
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
_Distance; //两个Iterator的距离用哪种类型来表示
typedef typename iterator_traits<_RandomAccessIterator>::value_type
_ValueType; //该迭代器所代表的元素的类型
...
}
以上例子说明Iterator需要给算法说明上述提到的三种属性:iterator_category、difference_type、value_type
Iterator本身必须定义5种相关类型,上述为其中三种。
Iterator的相关类型
template<typename _Tp>
struct _List_iterator
{
...
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef _Tp* pointer;
typedef _Tp& reference;
...
}
Iterator Traits的设计
由于Pointer本身无法回答5种相关类型,因此设计Iterator Traits用于分离Class Iterator和None-class.
//由Iterator_traits明显的构造5种相关类型
//模板的偏特化
template<typename _Tp>
struct iterator_traits<_Tp*>
{
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef _Tp& reference;
};