//五种迭代器类型
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_Access_Iterator_tag:public bidirectional_iterator_tag{};
//迭代器基类std:iterator,原生指针不需要用户定义
template<class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&>
class interator
{
typedef Category iterator_category;
typedef T value_type;
typedef Distance diferrence_type;
typedef Pointer pointer;
typedef Reference reference;
};
//traits
template<class iterator>
struct iteretor_traits
{
typedef typename iterator::iterator_category iterator_category;
typedef typename iterator::value_type value_type;
typedef typename iterator::diferrence_type diferrence_type;
typedef typename iterator::pointer pointer;
typedef typename iterator::reference reference;
};
//原生指针的traits偏特化版本
template<class T>
struct iteretor_traits<T*>
{
typedef random_Access_Iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t diferrence_type;
typedef T* pointer;
typedef T& reference;
};
//const原生指针的traits偏特化版本
template<class T>
struct iteretor_traits<const T*>
{
typedef random_Access_Iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t diferrence_type;
typedef const T* pointer;
typedef const T& reference;
};
//获取迭代器类型
template<class iterator>
inline typename iteretor_traits<iterator>::iterator_category
iterator_category(const iterator&){
typedef typename iteretor_traits<iterator>::iterator_category category;
return category();}
//获取迭代器的distance type
template<class iterator>
inline typename iteretor_traits<iterator>::diferrence_type*
diferrence_type(const iterator&){
return static_cast<typename iteretor_traits<iterator>::diferrence_type*>(0);}
//获取迭代器的value_type
template<class iterator>
inline typename iteretor_traits<iterator>::value_type
diferrence_type(const iterator&){
return static_cast<typename iteretor_traits<iterator>::value_type>(0);}
//distance函数
template<class InputIterator>
inline typename iteretor_traits<InputIterator>::diferrence_type
_distance(InputIterator first, InputIterator second, input_iterator_tag){
iteretor_traits<iterator>::diferrence_type n;
while(first != second) {++first; ++n;}
return n;
}
template<class RandomAccessIterator>
inline typename iteretor_traits<RandomAccessIterator>::diferrence_type
_distance(RandomAccessIterator first, RandomAccessIterator second, random_Access_Iterator_tag){
return second - first;
}
template<class InputIterator>
inline typename iteretor_traits<InputIterator>::diferrence_type
distance(InputIterator first, InputIterator second, input_iterator_tag){
return _distance(first, second, iterator_category(first);
}
//advance函数
template<class InputIterator, class distance>
inline void _advance(InputIterator first, distance n, input_iterator_tag){
while(n--) ++first;
}
template<class BidirectionalIterator, class distance>
inline void _advance(InputIterator first, distance n, bidirectional_iterator_tag){
if(n>0)
while(n--) ++first;
else
while(n++) --first;
}
template<class RandomAccessIterator, class distance>
inline void _advance(RandomAccessIterator first, distance n, random_Access_Iterator_tag){
first += n;
}
template<class InputIterator>
inline void distance(InputIterator first, distance n, input_iterator_tag){
return _advance(first, n, iterator_category(first));
摘自stl源码剖析