C/C++教程

C++标准库 第七章 STL迭代器

本文主要是介绍C++标准库 第七章 STL迭代器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

迭代器

  • 能力:行进和存取的能力

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

 

 

 

 

 

 

 缺省调用,后面三个数值均使用默认值

这篇关于C++标准库 第七章 STL迭代器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!