# 初识迭代器
## 参考资料
[迭代器](https://oi-wiki.org/lang/csl/iterator/)
## 初步介绍
迭代器(iterator)是用来访问 STL 容器中元素的对象,与指针类似,在实际使用中可以看做是指针。
迭代器主要支持两个运算:`++` 用来移动迭代器(访问后继迭代器),`*` 用来取出迭代器指向元素的值。双向迭代器支持 `--` 移动迭代器(访问前驱迭代器)。
首尾迭代器 `.begin()` `.end()`,分别指向第一个元素、最后一个元素后面的一个空的边界。
尾迭代器不存在后继迭代器,首迭代器不存在前驱迭代器。
```cpp
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
// 使用迭代器来遍历 vector 中的元素
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
// c++11 后可以使用 auto 关键字代替迭代器声明,本质是自动类型推导
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
// c++11 还可以使用基于范围的循环 range-based for-loop
for (int x : v) { // 对于容器 v 中的每个元素 x
cout << x << ' ';
}
```
`vector` 的迭代器是满足随机访问的,该种迭代器可以与一个整数相加减,`vector` 的两个迭代器相减得到他们对应下标的距离。
```cpp
cout << *(v.begin() + 3) << '\n'; // 输出 a[3]
cout << v.end() - v.begin() << '\n'; // 输出容器内元素个数
```
C++11 以后可以使用 `next(it)` 和 `prev(it)` 获取迭代器的前驱和后继。
```cpp
#include <iterator>
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
auto it = v.begin();
it = next(it); // it 指向 v[1]
sort(v.begin(), v.end()); // 排序
reverse(v.begin(), v.end()); // 翻转
```
如果迭代器指向的是具有多个成员的对象,可以使用 `->` 运算符来访问成员:
```cpp
vector<pair<int, int>> v;
v.push_back({1, 2});
auto it = v.begin();
cout << it->first << ' ' << it->second;
cout << (*it).first << ' ' << (*it).second;
```