Iterator(迭代器)是一种 "能够迭代某序列内所有元素"的对象,可通过改编自寻常pointer的一致接口来完成工作。
Iterator奉行一个纯抽象的概念: 任何东西,只要行为类似iterator,就是一种Iterator。但是不同的迭代器拥有不同的能力。
废话不多了说我们来了解一下迭代器的分类.
Output-iterator:
Output-iterator允许一步一步前行并搭配write动作.因此你可以通过Output-iterator对区间内的元素进行挨个赋值,但是不能使用Output-iterator对同一区间迭代2次.
其支持的操作:
*iter = val : 将val写到迭代器所指位置.
++iter : 向前步进,返回新位置(也可能只是个无用的操作,参考std::ostream_iterator).
iter++ : 向前步进,通常情况下返回旧位置(也可能只是个无用的操作,参考std::ostream_iterator).
标准库提供了std::ostream_iterator是典型的 Output-iterator!
我们常用的所有迭代器都具有Input-iterator的能力,而且更强.
Input-iterator:
Input-iterator迭代器只能一次一个以前进方向读取元素,按此顺序一个个返回元素值。
其支持的操作:
*iter : 返回读取到的值.
iter->member : 返回读取的元素的成员.
++iter : 向前步进(返回新位置).
iter++ : 向前步进(发挥旧位置).
iter1 == iter2 : 判断2个迭代器是否相等.
iter1 != iter2 : 判断2个迭代器是否不相等.
TYPE(iter) : 拷贝构造函数.
其中标准库对于Input-iterator的 ==和!= 没有要求: 如果两个input-iterator都不是尾后迭代器,且指向不同位置,他们的比较结果会不相等.
其中标准库中的std::istream_iterator是典型的Input-iterator!
Forward-iterator:
Forward-iterator提供保证: 如果两个Forward-iterator都不是尾后迭代器,且指向不同的位置,它们的比较结果一定不会相等!
其支持的操作:
*iter : 返回读取到的值.
iter->member : 访问读取到的元素的成员(如果有的话).
++iter : 向前步进(返回新位置).
iter++ : 向前步进(返回旧位置).
iter1 == iter2 : 判断2个迭代器是否相等.
iter1 != iter2 : 判断2个迭代器时候不相等.
TYPE() : 通过默认构造函数创建一个迭代器.
TYPE(iter) : 迭代器的拷贝构造函数.
iter1 = iter2 : 迭代器的拷贝赋值运算符.
两个Forward-iterator如果指向同一个元素,调用 == 会得到true, 如果两者同时递增会再次指向同一个元素.
其中标准库中的std::forward_list是典型的提供了Forward-iterator的代表.
Bidirectional-iterator:
Bidirectional-iterator是在Forward_iterator的基础上增加了回头的能力.换句话来说,它支持递减操作,可以一步一步后退.
其支持的操作:
*iter : 返回读取到的值.
iter->member : 访问读取到的元素的成员(如果有的话).
++iter : 向前步进(返回新位置).
iter++ : 向前步进(返回旧位置).
iter1 == iter2 : 判断2个迭代器是否相等.
iter1 != iter2 : 判断2个迭代器时候不相等.
TYPE() : 通过默认构造函数创建一个迭代器.
TYPE(iter) : 迭代器的拷贝构造函数.
iter1 = iter2 : 迭代器的拷贝赋值运算符.
--iter : 步退返回新位置.
iter-- : 步退返回旧位置.
Random-access-iterator:
Random-access-iterator迭代器在Bidirectional-iterator的基础上增加了随机访问的能力。因此它必须提供iterator算术运算。
其支持的操作:
*iter : 返回读取到的值.
iter->member : 访问读取到的元素的成员(如果有的话).
++iter : 向前步进(返回新位置).
iter++ : 向前步进(返回旧位置).
iter1 == iter2 : 判断2个迭代器是否相等.
iter1 != iter2 : 判断2个迭代器时候不相等.
TYPE() : 通过默认构造函数创建一个迭代器.
TYPE(iter) : 迭代器的拷贝构造函数.
iter1 = iter2 : 迭代器的拷贝赋值运算符.
--iter : 步退返回新位置.
iter-- : 步退返回旧位置.
iter[n] : 访问索引位置为n的元素(针对寻常的 C-Style array).
iter+n : 将迭代器向前前进n个位置.
n+iter : 将迭代器向前前进n个位置.
iter - n: 将迭代器后退n个位置.
iter1 - iter2 : 返回2个迭代器之间的位置.
iter1 < iter2 : 判断iter1是否在iter2之前.
iter1 > iter2 :判断iter1是否在iter2之后.
iter1 <= iter2 :判断iter1是否不在iter2之后.
iter1 >= iter2 : 判断iter1是否不在iter2之前.