前言
迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *
和operator->
进行重载, 使它表现的像一个指针.
类型
迭代器根据移动特性和实施操作被分为5类
- input iterator(输入迭代器) : 迭代器所指的内容不能被修改, 只读且只能执行一次读操作.
- output iterator(输出迭代器) : 只写并且一次只能执行一次写操作.
- forward iterator(正向迭代器) : 支持读写操作且支持多次读写操作.
- bidirectional iterator(双向迭代器) : 支持双向的移动且支持多次读写操作.
- random access iterator(随即访问迭代器) : 支持双向移动且支持多次读写操作. p+n, p-n等.
1~4类迭代器执行操作的就如 : p++, ++p, p->而不是5类的p+n操作. 不明白的我们下面会进行讲解.
源码分析
category的五类迭代器以及继承关系
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 {
};
这五个类都是空类, 只是为了之后调用时通过类选择不同的重载函数. 继承是为了可以使用传递调用,当不存在某种迭代器类型匹配时编译器会依据继承层次向上查找进行传递, 就可以通过继承关系来决定选择最优的调用. 我们通过用distance
来讲最优.
distance
是用于计算连个迭代器之间的距离, 因为重载就可以通过不同的迭代器类型选择不同的函数来提高效率.
这里distance
的iterator_category
函数是每个迭代器自己定义的, 跟traits
萃取器相关我准备放在下一篇章讲解. 这里只要知道它能通过first
参数推断出是哪一类的迭代器从而选择调用哪一个函数.
template <class InputIterator