0 - 前言

参考:http://c.biancheng.net/view/6675.html

1 - 迭代器定义

每一种容器都有对应类型的迭代器,也就是,不同容器的迭代器也不同,其功能强弱也有所不同。容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法。

2 - 迭代器分类

常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器双向迭代器随机访问迭代器 5 种。常用的就是后三种,输入迭代器和输出迭代器比较特殊,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象。

  • 前向迭代器(forward iterator):

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

  • 双向迭代器(bidirectional iterator)

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

  • 随机访问迭代器(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 之间的元素个数减一)。

在这里插入图片描述

3 - 迭代器使用

对于迭代器的用处,最常见的就是遍历某个容器

在遍历的过程中,遍历条件受不同种类的迭代器影响,常见的迭代方式主要有以下几种:

//v是一个容器,暂不指定类型
//遍历方式 ①
for(i = v.begin(); i != v.end(); ++i)
    cout << *i;

//遍历方式②:双向迭代器不支持用“<”进行比较
for(i = v.begin(); i < v.end(); ++i)
    cout << *i;

//遍历方式③:双向迭代器不支持用下标随机访问元素
for(int i=0; i<v.size(); ++i)
    cout << v[i];
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐