迭代器首先要看的是一些空类:
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 { };
称为标签技术,主要用途如下:
void func(input_iterator_tag){}
void func(output_iterator_tag){}
如果给func传入一个input_iterator_tag对象,调用第一个函数,传入一个input_iterator_tag对象,就调用第二个函数。
还有一个用途就是typedef _Category iterator_category;用于标记迭代器的类型。
值得注意的是
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;
};
标准库的很多容器迭代器的类型就是通过这个得到的。
标准库还定义了很多迭代器,比如reverse_iterator等,基本上就是把指针封装了一下,此处暂且不表