15C++复习.SLT迭代器
迭代器
迭代器(iterator):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。
迭代器模式:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。
STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂(iterator)将它们撮合在一起。
迭代器iterator 提供了一种一般化的方法对顺序或关联容器类型中的每个元素进行连续访问。例如,假设iter为任意容器类型的一个iterator,则++iter 表示向前移动迭代器使其指向容器的下一个元素,而*iter 返回iterator 指向元素的值,每种容器类型都提供一个begin()和一个end()成员函数。
end()返回一个iterator 它指向容器的末元素的下一个位置
通过迭代器,我们可以用相同的方式来访问、遍历容器。不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。
迭代器的作用:
能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代器,算法使用迭代器。各个迭代器的功能如下:
迭代器的操作:
每种迭代器均可进行包括表中前一种迭代器可进行的操作。
1、Input Iterators
Input Iterator只能逐元素的向前遍历,而且对元素是只读的,只能读取元素一次。通常这种情况发生在从标准输入设备(通常是键盘)读取数据时。
下面是Input Iterator的可用操作列表:
iter->member: 只读访问对应元素的成员
++iter: 向前遍历一步(返回最新的位置)
iter++: 向前遍历一步(返回原先的位置)
iter1 == iter2: 判断两个迭代器是否相等
iter1 != iter2:判断两个迭代器是否不等
TYPE(iter): 复制迭代器
2、Output Iterators
Output iterator跟Input Iterator相对应,只能逐元素向前遍历,而且对元素是只写的(*iter操作不能作为右值,只能作为左值),只能写入元素一次。通常这种情况发生在向标准输出设备(屏幕或者打印机)写入数据时,或者利用inserter向容器中追加新元素时。
下面是Output Iterator的可用操作列表:
++iter: 向前遍历一步(返回最新的位置)
iter++: 向前遍历一步(返回原先的位置)
TYPE(iter): 复制迭代器
3、Forward Iterators
Forward Iterator是Input Iterator和Output Iterator的结合,虽然也只能逐元素向前遍历,但可以对元素进行读写操作。下面看Forward Iterator的可用操作列表:
iter->member:
++iter:
iter++:
iter1 == iter2:
iter1 != iter2:
TYPE():
TYPE(iter):
iter1 = iter2:
跟Input Iterator和Output Iterator不同的是,Forward Iterator可以对同一元素访问多次。下面我们特别关注一下Forward Iterator和Output Iterator的区别:
(1)对于Output Iterator,写入数据时不检查目标容器是否到达结束位置是正确的做法,比如下面循环对于Output Iterator是成立的:
//error for forward iterator
while(true)
{
*pos = foo();
++pos;
}
(2)对于Forward Iterator,则必须保证访问元素的有效性,那么上面形式对Forward Iterator来说是错误的,因为当碰到容器end()位置时,导致不确定的后果。对于Forward Interator,上面形式必须修改为这样:
{
*pos = foo();
++pos;
}
4、Bidirectional Iterators
双向迭代器行为特征类似于Forward Iterator,只是额外增加了一个逐元素向后遍历的能力。所以对于双向迭代器可用的操作,除了包含Forward Iterator的所有操作外,多了一组向后遍历的操作:
iter--: 向后遍历一步(返回原有的位置)
5、Random Access Iterators
随机访问迭代器除了有双向迭代器的能力特征外,还可以进行元素随机访问。所以对于随机访问迭代器,增加了关于“迭代器运算”的一些操作。下面是除了双向迭代器的所有操作外,额外的操作列表:
iter+=n: 向前或向后(n为负数)遍历n个元素
iter-=n: 先后或向前(n为负数)遍历n个元素
iter+n: 返回当前位置后面第n个元素的iterator位置
n+iter: 同上
iter-n: 返回当前位置前面第n个元素的iterator位置
iter1-iter2: 返回iter1和iter2之间的距离(distance)
iter1<iter2: 判断iter1是否在iter2之前
iter1>iter2: 判断iter1是否在iter2之后
iter1<=iter2: 判断iter1是否不再iter2之后
iter1>=iter2: 判断iter1是否不再iter2之前
只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
转自https://blog.csdn.net/sinat_33924041/article/details/83687034
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)