1 头文件

  所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件。不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中。

2 迭代器类型

  迭代器共分为五种,分别为: Input iterator、Output iterator、Forward iterator、Bidirectional iterator、Random access iterator。

2.1 Input(输入)迭代器

  只能一次一个向前读取元素,按此顺序一个个传回元素值。表2.1列出了Input迭代器的各种操作行为。Input迭代器只能读取元素一次,如果你复制Input迭代器,并使原Input迭代器与新产生的副本都向前读取,可能会遍历到不同的值。纯粹Input迭代器的一个典型例子就是“从标准输入装置(通常为键盘)读取数据”的迭代器。

表达式

效果

*iter

读取实际元素

iter->member

读取实际元素的成员(如果有的话)

++iter

向前步进(传回新位置)

iter++

向前步进(传回旧位置)

iter1 == iter2

判断两个迭代器是否相同

iter1 != iter2

判断两个迭代器是否不相等

TYPE(iter)

复制迭代器(copy 构造函数)

表2.1

2.2 Output(输出)迭代器

  Output迭代器和Input迭代器相反,其作用是将元素值一个个写入。表2.2列出Output迭代器的有效操作。operator*只有在赋值语句的左手边才有效。Output迭代器无需比较(comparison)操作。你无法检验Output迭代器是否有效,或“写入动作”是否成功。你唯一可以做的就是写入、写入、再写入。

表达式

效果

*iter = value

将元素写入到迭代器所指位置

++iter

向前步进(传回新位置)

iter++

向前步进(传回旧位置)

TYPE(iter)

复制迭代器(copy 构造函数)

表2.2

2.3 Forward(前向)迭代器

  Forward迭代器是Input迭代器与Output迭代器的结合,具有Input迭代器的全部功能和Output迭代器的大部分功能。表2.3总结了Forward迭代器的所有操作。Forward迭代器能多次指向同一群集中的同一元素,并能多次处理同一元素。

表达式

效果

*iter

存取实际元素

iter->member

存取实际元素的成员

++iter

向前步进(传回新位置)

iter++

向前步进(传回旧位置)

iter1 == iter2

判断两个迭代器是否相同

iter1 != iter2

判断两个迭代器是否不相等

TYPE()

产生迭代器(default构造函数)

TYPE(iter)

复制迭代器(copy构造函数)

iter1 == iter2

复制

表2.3

2.4 Bidirectional(双向)迭代器

  Bidirectional(双向)迭代器在Forward迭代器的基础上增加了回头遍历的能力。换言之,它支持递减操作符,用以一步一步的后退操作。

2.5 Random Access(随机存取)迭代器  

  Random Access迭代器在Bidirectional迭代器的基础上再增加随机存取能力。因此它必须提供“迭代器算数运算”(和一般指针“指针算术运算”相当)。也就是说,它能加减某个偏移量、能处理距离(differences)问题,并运用诸如<和>的相互关系操作符进行比较。以下对象和型别支持Random Access迭代器:

  • 可随机存取的容器(vector, deque)

  • strings(字符串,string,wstring)

  • 一般array(指针)

3 迭代器相关辅助函数

3.1 advance() 令迭代器前进

3.2 distance() 处理迭代器之间的距离

3.3 iter_swap() 交换两个迭代器所指内容

4  迭代器配接器

4.1 Reverse(逆向迭代器)

  逆向迭代器重新定义递增运算和递减运算,使其行为正好倒置。成员函数rbegin()和rend()各传回一个Reverse迭代器,和begin()和end()类似,共同定义一个半开区间。用正向迭代器可以直接构造一个逆向迭代器,但是构造之后会出现“错位”现象。原因在逆向迭代器要保证半开区间不会越界,可调用逆向迭代器的base()函数,保证转换值的正确性(迭代器移了一位)。

4.2 Insert(安插型)迭代器

  Insert迭代器,也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型。所以它只提供赋值(assign)新值的能力。表4.2.1列出Insert迭代器的所有操作函数。

表达式

效果

*iter

无实际操作(传回iter)

iter = value

安插value

++iter

无实际操作(传回iter)

iter++

无实际操作(传回iter)

表4.2.1

  C++标准程序库提供三种Insert迭代器:back inserters, front inserters, general inserters。它们的区别在于插入位置。事实上它们各自调用所属容器中不同的成员函数。所以Insert迭代器初始化时要清楚知道自己所属的容器是哪一种。表4.2.2列出Insert迭代器的种类。

名称

Class

其所调用的函数

生成函数

Back inserter

back_inserter_iterator

push_back(value)

back_inserter(cont)

Front inserter

front_insert_iterator

push_front(value)

front_inserter(cont)

General inserter

insert_iterator

insert(pos, value)

inserter(cont, pos)

4.3 Stream(流)迭代器

Stream迭代器是一种迭代器配接器,通过它,你可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。

Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。

Ostream迭代器

ostream迭代器 可以被赋予的值写入output stream中。下表列出ostream迭代器的各项操作

算式

效果

ostream_iterator<T>(ostream)

为ostream产生一个ostream迭代器

ostream_iterator<T>(ostream, delim)

为ostream产生一个ostream迭代器,各元素间以delim为分隔符(请注意,delim的型别是const char*)

*iter

无实际操作(传回iter)

iter = value

将value写到ostream,像这样:ostream<<value。其后再输出一个delim(分隔符;如有定义的话)

++iter

无实际操作(传回iter)

iter++

无实际操作(传回iter)

Istream迭代器

istream迭代器是ostream迭代器的拍档,用来从input stream读取元素。透过istream迭代器,算法可以从stream中直接读取数据。istream迭代器的各项操作。

算式

效果

istream_iterator<T>()

产生一个end-of-stream迭代器

istream_iterator<T>(istream)

为istream产生的一个迭代器(可能立即去读第一个元素)

*iter

传回先前读取的值(如果构造函数并未立刻读取第一个元素值,则本式执行读取任务)

iter->member

传回先前读取的元素的成员(如果有的话)

++iter

读取下一个元素,并传回其位置

iter++

读取下一个元素,并传回迭代器指向前一个元素

iter1 == iter2

检查iter1和iter2是否相等

iter1 != iter2

检查iter1和iter2是否不相等

参考资料:《C++标准程序库》

本文完

转载请表明出处,谢谢

2011-06-25

转载于:https://www.cnblogs.com/chinazhangjie/archive/2011/06/25/2090084.html

《C++标准程序库》——STL迭代器相关推荐

  1. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  2. C++:迭代器(STL迭代器)iterator详解

    STL迭代器 参考链接:http://c.biancheng.net/view/338.html

  3. stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)

    趣乐博思剑指信奥 C++ 系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试 ...

  4. java 实现斐波切纳数列,求解这个算斐波切纳兔子有关问题的算法错哪了(和stl迭代器貌似有点关系)...

    求解这个算斐波切纳兔子问题的算法哪里错了(和stl迭代器貌似有点关系) #include #include #include #define BORN_AGE 3 #define DIE_AGE 12 ...

  5. 有指针为何还要STL迭代器

    指针和STL迭代器 1.迭代器 2.迭代器和指针的区别 3.迭代器产生原因 1.迭代器 Iterator(迭代器)模式又称 Cursor(游标)模式,用于提供一种方法顺序访问一个聚合 对象中各个元素, ...

  6. STL迭代器(iterator)用法详解

    C++ STL迭代器(iterator)用法详解 无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用"迭代器(iterator)"来实 ...

  7. STL — 迭代器设计思维(一)

    迭代器设计思维 关于迭代器的基础原理和作用我以前有一个博客提到过:STL迭代器的原理以及迭代器失效 我不推荐不够了解迭代器的读者直接来看这个 博客,因为你会觉得我在做一些无意义的事情,并且理解上面也会 ...

  8. STL — 迭代器设计思维(二)

    迭代器设计思维(二) 上一篇博客主要介绍了STL迭代器中的5种类型的迭代器,以及迭代器当中的5种相应型别,最后提到了traits编程技法. 这些都是尤为重要的,我们阅 读源码最重要的就是理解加应用.  ...

  9. 万字长文炸裂!手撕 STL 迭代器源码与 traits 编程技法

    大家好,我是小贺. 1. 前言 天下大事,必作于细. 源码之前,了无秘密. 上一篇,我们剖析了 STL 空间配置器,这一篇文章,我们来学习下 STL 迭代器以及背后的 traits 编程技法. 在 S ...

  10. C++中的迭代器(STL迭代器)iterator

    1.Cpp中的迭代器 要访问顺序容器和关联容器中的元素,需要通过迭代器(iterator)进行.迭代器是一个变量,相当于容器和操纵容器的算法之间的中介.迭代器可以指向容器中的某个元素,通过迭代器就可以 ...

最新文章

  1. Json对象和Json字符串
  2. Ubuntu之Pycharm:Ubuntu系统内Pycharm安装的图文教程
  3. JavaScript调用其他函数中的变量
  4. abaqus生成adams柔性体_基于ADAMS 的大型反铲挖泥机加装破碎锤 结构动力学分析
  5. 异常的产生与传递 java 1615309080
  6. 纯CSS实现table表头固定(自创备忘)
  7. Java语言程序设计(一)填空题
  8. 2015-ResNet讲解
  9. 2019windows上安装Mac OS 10.14过程详细截图
  10. NeHe_Lesson8 Blending
  11. 在linux中装多个mysql 服务(亲测有效)
  12. 周立功USBCANFD_200U的Python调用
  13. PDMS二次开发(十二)——螺栓材料统计功能一批bug修复之后再次用sample项目进行验证
  14. 软件测试中的版本控制
  15. 【leetcode】字符串(KMP、滑动窗口)
  16. adb安装报错情形以及解决办法
  17. android图片处理方法(不断收集中)
  18. 最长递增子序列问题(你真的会了吗)
  19. python3.7 模拟访问QQ空间
  20. php数组数据量过大时报错的问题

热门文章

  1. LordPE - PE编辑工具
  2. Jquery 使用技巧总结
  3. 如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)
  4. 显示水晶报表的公用类
  5. springboot访问路径添加项目名称、tomcat端口号
  6. 小程序或者APP 自行使用TOKEN 实现登录会话保持
  7. 9个Console命令
  8. 小程序的1024KB
  9. 兄弟节点div, +~选择器不能向前选择
  10. 2016年9月ccf