iterator遵循的设计原则
由于iterator是关联Contrainer和algorithms的纽带,当algorithms想要通过iterator处理元素时,有几个问题需要Iterator回答给algorithms。
- iterator指向元素类型
- iterator的类别
- iterator的差的类型
template<typename _ForwardIterator>
inline void
rotate(_ForwardIterator __first,
_ForwardIterator __middle
_ForwardIterator __last)
{
......
std::__rotate(__first, __middle, __last,
std::__iterator_catagory(__first));
}
template<typename _Iter>
inline typename iterator_traits<_Iter>::iterator_category
__iterator_category(const _Iter&)
{ return typename iterator_traits<_Iter>::iterator_category(); }
template<typename _RandomAccessIterator>
void
__rotate(_RandomAccessIterator __first,
_RandomAccessIterator __middle,
_RandomAccessIterator __last,
random_access_iterator_tag)
{
......
typedef typename iterator_traits<_RandomAccessIterator>::difference_type _Distance;
typedef typename iterator_traits<_RandomAccessIterator>::value_type _ValueType;
_Distance __n = __last - __first;
_Distance __k = __middle - __first;
......
}
假如传给algorithms的是native pointer,则需要引入iterator traits,统一处理class iterator和native iterator
下面是iterator_traits源代码
template<class I>
struct iterator_traits{
typedef typename I::iterator_category iterator_category;
typedef typename I::value_type value_type;
typedef typename I::difference_type difference_type;
typedef typename I::pointer pointer;
typedef typename I::reference reference;
};
//partial specialization for regular pointers
template<class T>
struct iterator_traits<T*>{
typedef random_access_iterator_tag iterater_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
//partial specialization for regular const pointers
template<class T>
struct iterator_traits<const T*>{
typedef random_access_iterator_tag iterater_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
对于传入的native pointer情况进行偏特化,注意const* T的偏特化版本中value_type是T而不是const T,因为value_type是为了声明变量,而声明一个无法赋值的变量没有用。