C++标准程序库笔记---迭代器

本文介绍了C++标准程序库中的迭代器概念,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器的特性和使用场景。并提及了迭代器在数据结构与算法解耦中的作用,以及迭代器相关辅助函数如`advance()`的使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器是一种能够遍历某个序列内所有元素的对象,它可以偷过于一般指针一直的接口来完成自己的工作,迭代器可以作为一种数据结构与算法解耦的手段使用,例如,某一算法可以通过迭代器来对顺序容器或二叉树做相同的操作。

迭代器种类:

迭代器类型能力供应者
输入迭代器向前读取istream
输出迭代器向前写入ostream,inserter
前向迭代器向前读取和写入 
双向迭代器向前和向后读取和写入list,set,multiset,map,multimap
随机访问迭代器随机存取,可读取也可写入vector,deque,string,array

1. 输入迭代器

input迭代器只能一次一个向前读取元素,input跌打器只能读取元素一次。如果复制input迭代器,并使原input迭代器和新产生的副本都向前读取,可能会遍历到不同的值

纯粹input迭代器的一个典型例子就是“从标准输入装置(通常为键盘)读取数据”的迭代器。同一个值不会被读取两次。如果两个input迭代器占用同一个位置,则两者相等。但是,这并不意味着他们存取元素时就会传回相同的值。

表达式效果
*iter读取实际元素
iter->member读取实际元素的成员
++iter向前步进(传回新位置)
iter++向前步进(传回旧位置)
iter1 == iter2判断两个迭代器是否相等
iter1 != iter2判断两个迭代器是否不相等
TYPE(iter)复制迭代器(copy构造函数)
应该尽可能优先选用前置式递增操作符,因为性能更好,不需要传回旧值,所以也就不必花费一个临时对象来保存旧值。临时变量总是const的,所以后缀表达式不能做左值。

2.输出迭代器

output迭代器将元素值一个个写入,只能一个元素一个元素地赋新值,不能用output迭代器对统一序列进行两次遍历。这就好像将元素写到黑洞里,如果在相同位置上对着一个黑洞惊醒第二次写入,不能确保这次写入值会覆盖前一个值

表达式效果
*iter = value将数值写到迭代器所指位置
++iter向前步进(传回新位置)向前步进
iter++向前步进(传回旧位置)
TYPE(iter)复制迭代器(copy构造函数)

3.前向迭代器

forward迭代器是input迭代器和output迭代器的结合,具有input迭代器的全部功能和output迭代器的大部分功能

表达式效果
*iter读取实际元素
iter->member读取实际元素的成员
++iter向前步进(传回新位置)
iter++向前步进(传回旧位置)
iter1 == iter2判断两个迭代器是否相等
iter1 != iter2判断两个迭代器是否不相等
TYPE(iter)复制迭代器(copy构造函数)
TYPE()产生迭代器(default构造函数)
iter1 = iter2赋值
和input迭代器和output迭代器不同,forward迭代器能够多次指向同一群集(collection)中的同一元素, 并能多次处理同一元素

output迭代器无需检查是否抵达序列尾端,便可以直接写入数据,output迭代器不提供比较操作,所以不能将output迭代器和尾端迭代器想比较。

对于forward迭代器,必须在提取数据之前确保它有效,否则会发生未定义行为。

4.双向遍历器

Bidirectional迭代器在forward迭代器的基础上增加了回头遍历的能力。支持--iter和iter--操作

5.随机存取迭代器

random access爹哎器在bidirectional迭代器基础之上再增加随机存取能力。因此它必须提供“迭代器算术运算”,也就是说,它能加减某个偏移量、能处理距离问题,并能运用诸如<和>的相互关系运算操作符进行比较。

以下对象和型别支持random access迭代器

  • 可随机存取的容器(vector,deque)
  • string(字符串,string,wstring)
  • 一般array(指针)
算式效果
iter[n]存取索引位置为n的元素
iter += n向前跳n个元素(如果n是负数, 则向后跳)
iter -= n向后跳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之前

迭代器相关辅助函数

advance() 可将迭代器的位置增加,增加的幅度由参数决定,使迭代器一次前进或后退多个元素

#include <iterator>

void advance(InputIterator& pos, Dist n)

advance()并不检查迭代器是否超过序列的end()(因为迭代器通常不知道其所操作的容器,因此无从检查)。所以调用advance()可能导致未定义行为。

此函数总能根据迭代器类型采用最佳方案,这归功于迭代器特征(iterator traits)的运用。对于Random Access迭代器,此函数只是简单地调用pos += n,对于其他任何类型的迭代器,则调用++pos或--pos



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值