前言

参考自:C++迭代器(STL迭代器)iterator详解 (biancheng.net)

迭代器种类

  1. 正向迭代器

    1
    容器类名::iterator  迭代器名;
  2. 常量正向迭代器

    1
    容器类名::const_iterator 迭代器名;
  3. 反向迭代器

    1
    容器类名::reverse_iterator 迭代器名;
  4. 常量反向迭代器

    1
    容器类名::const_reverse_iterator 迭代器名;

迭代器使用

迭代器类似于指针,可以指向容器中的不同元素并进行修改(常量迭代器无法修改),*迭代器就代表元素本身

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
vector<string> flowers = {"LJY", "WY", "WZ", "DQY"};

// 定义正向迭代器
cout << "正向迭代器: " << endl;
cout << "修改前: " << endl;
for (vector<string>::iterator iter = flowers.begin(); iter != flowers.end(); ++iter) // 使用前置++效率更高
{
cout << *iter << endl;
transform((*iter).begin(), (*iter).end(), (*iter).begin(), tolower); // 利用迭代器修改元素
}
cout << "修改后: " << endl;
for (vector<string>::iterator iter = flowers.begin(); iter != flowers.end(); ++iter) // 使用前置++效率更高
{
cout << *iter << endl;
}

// 定义反向迭代器
cout << "\n反向迭代器: " << endl;
for (vector<string>::reverse_iterator iter = flowers.rbegin(); iter != flowers.rend(); iter++)
{
cout << *iter << endl;
}
return 0;
}

功能分类

1) 正向迭代器,支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==!=运算符进行比较。

2) 双向迭代器,具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则--pp--都是使得 p 朝和++p相反的方向移动。

3) 随机访问迭代器。具有双向迭代器的全部功能。若 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 还可以用 <、>、<=、>= 运算符进行比较。p1<p2的含义是:p1 经过若干次(至少一次)++操作后,就会等于 p2。其他比较方式的含义与此类似

对于两个随机访问迭代器 p1、p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数加一

不同容器的迭代器的功能

容器或容器适配器 迭代器功能
vector 随机访问
deque 随机访问
list 双向
set / multiset 双向
map / multimap 双向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器