# 初识迭代器 ## 参考资料 [迭代器](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; ```