在数组vector 中,我们使用了下标遍历容器数组的每一个元素。
例如:
- vector<int> v(10);//创建10个值为0的元素
-
- for (size_t i = 0; i < v.size(); ++i)
- {
- cout << v[i] << " ";
- }
迭代器是专门用来遍历容器的对象(是容器类的内部类型)。
有了迭代器,我们可以像下面这样实现上面的代码:
- #include
- #include
- using namespace std;
-
- int main()
- {
- vector<int> v{1,2,3,4,5,6,7,8,9};//初始化9个元素
-
- for (auto itr = v.begin(); itr != v.end(); ++itr)
- {
- cout << *itr << " ";
- }
-
- return 0;
- }
程序输出:
更具体的介绍请看下文。
v的迭代器的类型为:vector
所以,定义一个迭代器变量的写法为:
vector<int>::iterator itr = v.begin()
而使用auto 就可以让代码大大简化:
auto itr = v.begin()
迭代器就是拥有下面的能力的对象:
| v.begin() | 返回指向第一个元素的迭代器 | |
| v.end() | 指向最后一个元素的下一个位置的迭代器 | 迭代器到达这里表示迭代结束,专门用来结束迭代 |
| *itr | 解引用,获得所指向元素的引用 | |
| ++itr | 向后移动一次,指向下一个元素 |
创建迭代器变量:
++itr表示迭代器自增操作,迭代器指向下一个元素
解引用得到了变量本身,所以可以对变量进行读写。
上图中的 itr 可以像下面这样使用:
- cout<<*itr;//输出33
- *itr = 123;//修改变量arr[1]的值为123
下面我们就用迭代器来遍历数组,看看两者的相同与不同:
- #include
- #include
- using namespace std;
-
- int main()
- {
- //定义一个数组,并放入一些整数
- vector<int> a{ 0,1,2,3,4,5,6,7,8,9 };
- //使用下标遍历数组输出其中的每一个元素
- for (int i = 0; i < a.size(); ++i)
- {
- cout << a[i] << " ";
- }
- cout << endl;
- //使用迭代器输出数组中的每一个元素
- for (auto itr = a.begin(); itr != a.end(); ++itr)
- {
- cout << *itr << " ";//使用解引用操作符*获得迭代器迭代到的元素的引用
- }
- return 0;
- }
输出如下:

从上面的代码中,我们可以对比看看迭代器遍历数组和下标遍历数组的异同:
| 下标访问 | 迭代器访问 | |
|---|---|---|
| 访问第N个元素的形式 | a[i] | *itr |
| 访问第1个元素的形式 | a[0] | *a.begin() |
| 访问最后一个元素的形式 | a[a.size()-1] | *(a.begin()+a.size()-1) |
| 循环结束的条件 | i < a.size() | itr != a.end() |
| 移下一个元素 | ++i | ++itr |