目录
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag: public input_iterator_tag{}; //继承自input
struct bidirectional_iterator_tag :public forward_iterator_tag{};//继承自forward
struct random_access_iterator_tag:public bidirectional_iterator_tag{};? ? ?? ????? 
? 
input iterator 只能够与单遍算法一起使用,不能被赋值,是所有迭代器等级中最低的一个。当我们搜索范围内的元素时,每个位置最多只能被访问一次。可以将输入迭代器与另一个迭代器比较,因此只有两个迭代器指向相同位置时,这两个迭代器才相等。输入迭代器只能单向递增。1
template<class InputIterator>
inline iterator_traits<InputIterator>::difference_type //返回类型应该用iterator_traitsqu
distance(InputIterator first, InputIterator last) {
    typedef typename iterator_traits<InputIterator>::iterator_category categor;
    return _distance(first,last,category);
}_distance()是重载函数,根据category的类型分别重载为下面两个:
template<class RandomAccessIterator>
inline iterator_traits<RandomAccessIterator>::difference_type
__distance(RandomAccessIterator first, RandomAccessIterator last,random_access_iteraotr_tag) {
    return last-first;
}template<class InputIterator>
inline iterator_traits<InputIterator>::difference_type
__distance(InputIterator first, InputIterator last,input_iterator_tag) {
    iterator_traits<InputIterator>::difference_type n = 0;
    while(first != last) {
        ++first;
        ++n;
    }
    return n;
}template<class InputIterator, class Distance>
inline void advance(InputIterator& i, Distance n) {
    __advance(i,n,iterator_category(i));
}
//其中iterator_category的作用是萃取出距离的类型:
template<class Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&) {
    typedef typename iterator_traits<Iterator>::iterator_category category;
    return category();
}根据category()的类型对_advance()函数进行重载:
template<class InputIterator, class Distance>
inline void _advance(InputIterator& i, Distance n, input_iterator_tag) {
    while(n--) ++i;
}template<class BidirectionalIterator,class Distance>
inline void _advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag) {
    if(n >= 0) 
        while(n--) ++i;
    else 
        while(n++) --i;
}template<class RandomAccessIterator,class Distance>
inline void _advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag) {
    i+=n;
}虽然重载的函数,有些并没有farwardIterator,但是它和inputIterator是继承关系,所以也是可以使用这个函数。
原文:https://www.cnblogs.com/ccpang/p/12284015.html