迭代器

Iterator(迭代器) 模式又称 Cursor(游标) 模式, 用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 或者这样说可能更容易理解: Iterator模式是运用于聚合对象的一种模式, 通过运用该模式, 使得我们可以在不知道对象内部表示的情况下, 按照一定顺序(由 iterator 提供的方法) 访问聚合对象中的各个元素。

迭代器能够让迭代器与算法不干扰的相互发展, 最后又能无间隙的粘合起来;重载了 -> ,* ,++ ,--, ==, !=, == 运算符。 用以操作复杂的数据结构;容器提供迭代器, 算法使用迭代器;

迭代器分类

Input Iterators

input 迭代器只能一次一个向前读取元素, 按此顺序一个个传回元素值。 input 迭代器的各项操作

*iter读取实际元素
iter->member读取实际元素的成员
++iter向前步进, 传回新位置
iter++向前步进, 传回旧位置
iter1 == iter2判断两个迭代器是否相等
TYPE(iter)复制迭代器(copy 构造函数)

Output Iterators

output 迭代器哦和 input 迭代器相反, 其作用是将元素值一个个写入。 也就是说, 你只能一个元素一个元素地赋新值。 output 相关操作:

*iter = value将元素值写到迭代器位置
++iter向前步进, 传回新位置
iter++向后步进, 返回旧位置
TYPE(iter)复制迭代器(copy 构造函数)

Forward Iterators

forword 迭代器是 input 和 output 迭代器的结合, 兼具了两者的功能, 更为普适的迭代器。 forword 迭代器的各项操作:

*iter存取实际元素
iter->member读取实际元素的成员
++iter向前步进, 传回新位置
iter++向前步进, 传回旧位置
iter1 == iter2判断两个迭代器是否相等
TYPE(iter)复制迭代器(copy 构造函数)
TYPE()产生迭代器(default 构造函数)
iter1 = iter2赋值

Bidirectional Iterators

bidirectional 迭代器在 forword 迭代器的基础上增加了回头遍历的能力。 换言之, 它支持一步步后退的操作。 新增操作:

--iter退步(传回新位置)
iter--退步(传回旧位置

Random-Access Iterators

iter[n]取索引位置为 n 的元素
iter += n向前跳 n 个元素
iter -= n向后跳 n 个元素
iter + n传回 iter 之后的第 n 个元素
n + iter传回 iter 之后的第 n 个元素
iter - n传回 iter 之前的第 n 个元素
iter1 - iter2传回 iter1 和 iter2 之间的距离
iter1 < iter2判断 iter1 是否在 iter2 之前
iter1 > iter2判断 iter1 是否在 iter2 之后
iter1 <= iter2判断 iter1 是否不在 iter2 之后
iter1 >= iter2判断 iter1 是否不在 iter2 之前

常见容器的迭代器

容器支持的迭代器类别
vector随机访问
deque随机访问
list双向
set双向
multiset双向
map双向
multimap双向
stack不支持
queue不支持
priority_queue不支持

迭代器附加 Auxiliary(辅助) Iterator Functions

STL 提供了额外的 5 个函数, advance(),next(), prev(), distance(), and iter_swap(),前 4个函数, 是用于非 random-access Iterator, 可以实现多步跨越。 最后一个函数用于交换两个 iterator。

#include <iterator>
void advance (InputIterator& pos, Dist n)
ForwardIterator next (ForwardIterator pos) ForwardIterator next (ForwardIterator pos, Dist n)
BidirectionalIterator prev (BidirectionalIterator pos) BidirectionalIterator prev (BidirectionalIterator pos, Dist n)
Dist distance (InputIterator pos1, InputIterator pos2)
void iter_swap (ForwardIterator1 pos1, ForwardIterator2 pos2)
Last modification:September 16th, 2019 at 07:09 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment