








#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {10, 20, 30, 40};
// 方式 1:传统迭代器写法
for (auto it = v.begin(); it != v.end(); ++it)
std::cout << *it << ' ';
std::cout << '\n';
// 方式 2:范围 for(完全等价)
for (int x : v)
std::cout << x << ' ';
std::cout << '\n';
// 方式 3:下标(vector 专享,因为它是随机访问)
for (size_t i = 0; i < v.size(); ++i)
std::cout << v[i] << ' ';
std::cout << '\n';
}
std::vector<int> v = {10, 20, 30, 40};
auto it = v.begin();
std::cout << *it << '\n'; // 10,像 *p
++it; // 前进
std::cout << *it << '\n'; // 20
it += 2; // 跳两步(随机访问才有的能力)
std::cout << *it << '\n'; // 40
// 两个迭代器相减 = 距离
auto dist = v.end() - v.begin(); // 4,即 v.size()
std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it)
*it = (*it) * 2; // 每个元素翻倍
// v 变成 {2, 4, 6}
for (auto it = v.rbegin(); it != v.rend(); ++it)
std::cout << *it << ' ';
// 输出:6 4 2
给定 vector<int> v = {3, 7, 2, 9, 5, 1},用迭代器遍历,找到最大值和它的下标。
💡 提示:
auto it = v.begin() + i从下标算出迭代器;it - v.begin()或std::distance(v.begin(), it)从迭代器反算下标
删除 v = {1, 2, 3, 4, 5, 6, 7, 8} 中所有偶数位置(0-based)的元素,结果应为 {1, 3, 5, 7}。
⚠️ 注意:删除元素可能导致迭代器失效。当前只做思考和伪代码,下一课讲具体方案。
在 vector 和后面学的容器上,分别试试 it + 3 这行能不能编译。预测一下结果。
Q1:下面两种写法有区别吗?哪种更好?
for (auto it = v.begin(); it != v.end(); ++it) // ①
for (auto it = v.begin(); it != v.end(); it++) // ②
Q2:v.end() 指向什么?能用 *v.end() 取值吗?
Q3:为什么 std::list 能用 ++it 但不能用 it += 3?
| 项目 | 内容 |
|---|---|
| 本质 | 广义指针,统一不同容器的遍历方式 |
| 获取 | container.begin() / container.end() |
| 核心操作 | *it 取值、++it 前进、it != end 判断 |
| 范围 for | for (auto x : v) = 迭代器遍历的语法糖 |
| 五种能力等级 | 输入 < 输出 < 前向 < 双向 < 随机访问 |
| vector 迭代器 | 随机访问级,支持 it + n、it - it |
| 常见坑 | 不要解引用 end();某些操作会让迭代器失效 |
| 下一课 | std::vector 进阶篇——insert/erase、扩容细节、迭代器失效 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。