C++ STL迭代器(iterator)用法详解

无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?

我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。

既然类似,完全可以利用泛型技术,将它们设计成适用所有容器的通用算法,从而将容器和算法分离开。但实现此目的需要有一个类似中介的装置,它除了要具有对容器进行遍历读写数据的能力之外,还要能对外隐藏容器的内部差异,从而以统一的界面向算法传送数据。

这是泛型思维发展的必然结果,于是迭代器就产生了。简单来讲,迭代器和 C++ 的指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。

迭代器类别

常用的迭代器按功能强弱分为输入迭代器输出迭代器前向迭代器双向迭代器随机访问迭代器

  1. 前向迭代器(forward iterator
    假设 p 是一个前向迭代器,则 p 支持 ++p,p++,*p 操作,还可以被复制或赋值,可以用 == 和 != 运算符进行比较。此外,两个正向迭代器可以互相赋值。

  2. 双向迭代器(bidirectional iterator
    双向迭代器具有正向迭代器的全部功能,除此之外,假设 p 是一个双向迭代器,则还可以进行 --p 或者 p-- 操作(即一次向后移动一个位置)。

  3. 随机访问迭代器(random access iterator
    随机访问迭代器具有双向迭代器的全部功能。除此之外,假设 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:

  • p+=i:使得 p 往后移动 i 个元素。
  • p-=i:使得 p 往前移动 i 个元素。
  • p+i:返回 p 后面第 i 个元素的迭代器。
  • p-i:返回 p 前面第 i 个元素的迭代器。
  • p[i]:返回 p 后面第 i 个元素的引用。

此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。另外,表达式 p2-p1 也是有定义的,其返回值表示 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。

C++ 11 标准中不同容器指定使用的迭代器类型:

容器 对应的迭代器类型
array 随机访问迭代器
vector 随机访问迭代器
deque 随机访问迭代器
list 双向迭代器
set / multiset 双向迭代器
map / multimap 双向迭代器
forward_list 前向迭代器
unordered_map / unordered_multimap 前向迭代器
unordered_set / unordered_multiset 前向迭代器
stack 不支持迭代器
queue 不支持迭代器

迭代器的定义方式

迭代器定义方式 具体格式
正向迭代器 容器类名::iterator 迭代器名;
常量正向迭代器 容器类名::const_iterator 迭代器名;
反向迭代器 容器类名::reverse_iterator 迭代器名;
常量反向迭代器 容器类名::const_reverse_iterator 迭代器名;

实例1

/********************************************************************   > File Name: vector-iterator.cpp*   > Create Time: 2021年09月27日 15:11:00******************************************************************/
#include <iostream>
#include <vector>
using namespace std;int main(int argc, char* argv[])
{/* 创建一个向量容器v */vector<int> v{1, 2, 3, 4, 4, 6, 7, 8, 9, 10};cout << "1--------------" << endl;for(int i = 0; i< (int)v.size(); i++){cout << v[i] << " ";}cout << endl << "2--------------" << endl;vector<int>::iterator i; // 创建一个正向迭代器for(i = v.begin(); i != v.end(); i++){cout << *i << " ";}cout << endl << "3--------------" << endl;for(i = v.begin(); i < v.end(); i++){cout << *i << " ";}cout << endl << "4--------------" << endl;i = v.begin();while(i != v.end()){cout << *i << " ";i += 2;}return 0;
}

编译、运行:

PS E:\fly-prj\cplusplus\day20> .\vector-iterator.exe
1--------------
1 2 3 4 4 6 7 8 9 10
2--------------
1 2 3 4 4 6 7 8 9 10
3--------------
1 2 3 4 4 6 7 8 9 10
4--------------
1 3 4 7 9

实例2

数组也是容器。数组的迭代器就是指针,而且是随机访问迭代器。

/********************************************************************   > File Name: array-test.cpp*   > Create Time: 2021年09月27日 16:13:19******************************************************************/
#include <iostream>
using namespace std;int main(int argc, char* argv[])
{int a[10] = {1,2,3,4,5,6,7,8,9,10};int* p = a; // p是a的迭代器for(int i = 0; i < 10; i++){printf("%d ", *p);p++;}return 0;
}

编译、运行:

PS E:\fly-prj\cplusplus\day20> make
g++ -o array-test array-test.cpp -g -Wall
PS E:\fly-prj\cplusplus\day20> .\array-test.exe
1 2 3 4 5 6 7 8 9 10

实例3

/********************************************************************   > File Name: list-const_iterator.cpp*   > Create Time: 2021年09月27日 16:46:41******************************************************************/
#include <iostream>
#include <vector>
#include <list>
using namespace std;int main(int argc, char* argv[])
{list<int> v;list<int>::const_iterator  i; /*创建一个常量正向迭代器*//* OK */for(i = v.begin(); i!= v.end(); ++i){cout << *i ;}#if 0/* 不支持<运算符 */// ERR:no match for ‘operator<’ (operand types are ‘std::list<int>::const_iterator’ and ‘std::list<int>::iterator’)for(i = v.begin(); i < v.end(); ++i){cout << *i;}#endif#if 0/* 不支持下标访问 */// ERR:no match for ‘operator[]’ (operand types are ‘std::list<int>’ and ‘int’)for(int i = 0; i < v.size(); ++i){cout << v[i];}#endifreturn 0;
}

C++ STL标准手册

STL迭代器(iterator)用法详解相关推荐

  1. C++ STL容器 —— array 用法详解

    C++ STL容器 -- array 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别人的博客终究是 ...

  2. C++ - const 与 迭代器(iterator) 使用 详解

    const 与 迭代器(iterator) 使用 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/16030561 迭代器(i ...

  3. STL —— multimap的用法详解

    文章目录 multimap的基本性质 STL--multimap容器的用法 multimap容器的创建与初始化 multimap容器包含的成员方法 multimap容器大小 multimap容器中键值 ...

  4. STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  5. [转] STL中map用法详解

    一.Map概述          Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完 ...

  6. STL中list用法详解

    本文转载自百度文库.作者如下.其中下面的count, count_if等函数的使用有些陈旧,如在编译时遇到问题,请百度. 标准模板库(STL)介绍 作者:Scott Field 本文以List容器为例 ...

  7. STL:list用法详解

    list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间. ...

  8. STL之string用法详解

    2.1 string容器介绍 string也属于STL常用容器之一,因此vector(参考博客)中的大部分方法与迭代器都适用于string容器.string容器用于保存字符串,使用一组连续的内存单元来 ...

  9. STL:bitset用法详解

    文章目录 前言 声明 输入输出 访问与修改 位运算 所谓bitset,就是bit组成的set (逃) 前言 bitset的诸多好处: 1.节约空间 2.增加一些新的功能 3.几乎没有副作用 4.有了1 ...

  10. C++中的unordered_map用法详解

    1 简介 unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value. key值应该是唯一的,key和value的数据类型可以不相同. uno ...

最新文章

  1. 用python画玫瑰花代码-Python | 用turtle库画玫瑰花
  2. shell基础09 gawk程序(上)
  3. c语言编程文件中删除数据结构,C语言数据结构实战(一)顺序表的插入与删除
  4. Ubuntu品牌机批量涌入世界市场,中国不会例外
  5. Python中文编码问题详解
  6. django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用
  7. mysql 几级缓存_Mysql中一级缓存二级缓存区别
  8. Linux-进程管理
  9. 电脑如何连接蓝牙音箱_蓝牙音箱如何办理SRRC认证
  10. ADO.NET实例教学一
  11. windows下安装jmeter
  12. Android-蓝牙AVRCP 以及 绝对音量(absolute volume)概述-A2dp-hfp
  13. 1.如何判断正交表对错
  14. 2021年国内好用的可视化工具
  15. 雪亮工程建设标准_2018年雪亮工程建设方案
  16. Operator norm - 算子范数
  17. Nmap扫描工具介绍
  18. 病毒制作实践小记:运行关机、蓝屏炸弹、进程关闭、拓展名病毒
  19. 【linux】部署磁盘列阵RAID 10,报错mdadm: super1.x cannot open /dev/sdb: Device or resource busy
  20. 美国 转专业 计算机,​转专业申请计算机硕士,美国这些学校供你选择

热门文章

  1. HTML+PHP+MYSQL将数据库中的数据用表格显示
  2. C# Aspose 操作Word书签
  3. linux flash插件安装方法,Linux系统下安装Flash浏览器插件的方法
  4. 美团2023届笔试题解
  5. 【无标题】AD导入CAD文件发现找不到图形
  6. 打开u盘时出现“文件或目录损坏且无法读取”怎么办?
  7. 如何修改MySQL监听IP地址
  8. Android近距离通信
  9. 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
  10. windows10中Office2016自定义安装、visio的安装,并安装到其他盘的方法