迭代器
- 能力:行进和存取的能力
Input迭代器
- 一次一个向前读取元素,按此顺序一个一个返回元素
- 例子:从标准输入装置(键盘) 读取数据,同一个数据不会被读取两次,流水一样,指向的是逻辑位置
- 使用前置式递增运算符 ++x 替代后置式递增运算符x++,前者不需要返回旧的数值,不需要花费一个对象来保存旧的数值
- Input无递减运算操作符号
Output输出迭代器
- 和input迭代器相反,作用是将元素数值一个一个写入。不可以使用输出迭代器对同一序列进行两次遍历写入、
- operator* 只有在赋值语句的左手边才会有效
- 输出迭代器没有比较操作,无法检测 输出迭代器是否有效,或者写入数据是否成功
- 例子:inserters用于将元素插入到容器内的一种迭代器,对其赋予一个新的数值,就会将其安插在容器内部,元素之前不会被覆盖
Forward (前向)迭代器
- forward前向迭代器是 input(全部功能)和output(部分功能)迭代器的结合。
- 区别于输出迭代器,前向迭代器可以多次指向同一群集中的同一个元素,并可以多次处理同一个元素
// Ok for output iterators
// Error for forward iterators
while(true){*pos = foo();++pos;
}// Ok for forward iterators
// Error for output iterators
while(pos != coll.end()){*pos = foo();++pos;
}
- forward迭代器提领数据之前需要确保数据有效,如果使用while(true),就会出现错误,因为forward会访问 end()对应的元素,引发错误
- 输出迭代器不可以使用 这个循环 while(pos != coll.end()) ,因为其没有定义operator!=
Bidirectional
Random Access (随机存取)迭代器
- 需要提供迭代器的算数运算,类似于指针的算数运算,也就是加减某一个特定的偏移量,能处理距离问题,使用诸如 < >等相互关系运算符进行比较
- 支持随机存取迭代器的对象和型别:可随机存取的容器(vector\deque)、strings(字符串、string、wstring)、一般的array(指针)
- 只有是随机存取迭代器才可以使用operator < 作为循环的结束与否的判断条件
- 代码一定要严谨:比如(coll.end()-1)如果群集为空,便会访问到begin()之前的数据,出现错误;
- 下面的代码可能出现问题,vector迭代器可能被实例化为一般的指针,考虑到C++不允许你修改任何基本型别的暂时值(包括指针),但是struct和class可以,因此使用辅助对象
- strings迭代器也常会被实例化为一般的字符指针
迭代器相关的辅助函数
- advance() 、distance() 适用于random access迭代器,前进后退以及处理迭代器之间的距离
- iter_swap适用于迭代器的数值交换
迭代器配接器
- 逆向模式、安插模式、流模式
逆向模式
- 重新定义递增和递减运算,行为倒置
Insert迭代器
- 将赋值新值转化为安插新值
Input stream
缺省调用,后面三个数值均使用默认值