迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的接口
迭代器( iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规 指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用 算法有机的统一起来。
迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的 指针接口一致。不同之处在于,迭代器是个所谓的 复杂的指针,具有遍历复杂 数据结构的能力。其下层运行机制取决于其所遍历的 数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型号却不同。这直接导出了 泛型 程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。
首先举一个简单的例子求容器中元素值得平方:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1#include <iostream>
2#include <vector>
3using namespace std;
4
5int main()
6{
7 vector<int>::iterator i;
8 vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
9
10 for(i = v.begin(); i != v.end(); ++i) //利用迭代器遍历容器中的每一个元素
11 {
12 (*i) *= (*i);
13 cout << "*i = " << *i << endl;
14 }
15
16
17 return 0;
18}
19
1
2
3
4
5
6
7
8
9
10
11
12
13 1root@xiaodai-virtual-machine:~# g++ j.cpp -o k -std=c++11
2root@xiaodai-virtual-machine:~# ./k
3*i = 1
4*i = 4
5*i = 9
6*i = 16
7*i = 25
8*i = 36
9*i = 49
10*i = 64
11*i = 81
12
13
在C++11特性中还有一种形式处理每个元素,使用基于范围的for语句
范围for语句。这种语句遍历给定序列中的每个元素并对序列中的每个值执行某中操作,其语法形式为:
1
2
3 1for (declaration : expression)
2 statement
3
其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值,举一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1#include <iostream>
2#include <vector>
3using namespace std;
4
5int main()
6{
7 vector<int>::iterator i;
8 vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
9
10 for(auto &i : v) //对于容器v中的每个元素进行遍历(i是引用)
11 i *= i; //求元素值得平方
12 for(auto i : v) //对于容器v中的元素进行遍历
13 cout << i << " " << endl;
14
15 return 0;
16}
17
1
2
3
4
5
6
7
8
9
10
11
12
13 1root@xiaodai-virtual-machine:~# g++ j.cpp -o k -std=c++11
2root@xiaodai-virtual-machine:~# ./k
31
44
59
616
725
836
949
1064
1181
12
13
指针也是迭代器,就像使用迭代器遍历vector对象中的元素一样,使用指针也能遍历数组中的元素。
1
2
3
4 1int str[] = {1, 2, 3, 4, 5, 6, 7, 8};
2int *p = str;
3++p;
4
1
2 1 这样做的前提是先获取到指向数组第一个元素的指针和指向数组尾元素的下一位值的指针
2