02 — 迭代器基础

💻 上手代码

显式用迭代器遍历 vector

#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

✍️ 练手题

题 1:用迭代器找最大值

给定 vector<int> v = {3, 7, 2, 9, 5, 1},用迭代器遍历,找到最大值和它的下标。

💡 提示:auto it = v.begin() + i 从下标算出迭代器;it - v.begin()std::distance(v.begin(), it) 从迭代器反算下标

题 2:用迭代器实现"隔一个删一个"

删除 v = {1, 2, 3, 4, 5, 6, 7, 8} 中所有偶数位置(0-based)的元素,结果应为 {1, 3, 5, 7}

⚠️ 注意:删除元素可能导致迭代器失效。当前只做思考和伪代码,下一课讲具体方案。

题 3:比较不同容器的迭代器能力

vector 和后面学的容器上,分别试试 it + 3 这行能不能编译。预测一下结果。


❓ 自测 3 问

Q1:下面两种写法有区别吗?哪种更好?

for (auto it = v.begin(); it != v.end(); ++it)    // ①
for (auto it = v.begin(); it != v.end(); it++)     // ②

Q2v.end() 指向什么?能用 *v.end() 取值吗?

Q3:为什么 std::list 能用 ++it 但不能用 it += 3


📋 速查卡

项目 内容
本质 广义指针,统一不同容器的遍历方式
获取 container.begin() / container.end()
核心操作 *it 取值、++it 前进、it != end 判断
范围 for for (auto x : v) = 迭代器遍历的语法糖
五种能力等级 输入 < 输出 < 前向 < 双向 < 随机访问
vector 迭代器 随机访问级,支持 it + nit - it
常见坑 不要解引用 end();某些操作会让迭代器失效
下一课 std::vector 进阶篇——insert/erase、扩容细节、迭代器失效
posted @ 2026-05-09 23:20  thammer  阅读(7)  评论(0)    收藏  举报