Menu
CoddyTech

迭代器

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 72 课,共 104 课。

迭代器是连接容器和算法的对象。无论容器内部如何存储数据,迭代器都能提供统一的方式来访问其中的元素。你可以把迭代器看作一种通用指针,它知道如何在容器中移动。

每个 STL 容器都提供 begin() 和 end() 方法。begin() 迭代器指向第一个元素,而 end() 指向最后一个元素之后的位置,这是一个标记停止位置的哨兵:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // 解引用以获取值
    }
    // 输出:10 20 30
}

auto 关键字大大简化了迭代器声明:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // 通过迭代器修改元素
}
// nums 现在是 {20, 40, 60}

迭代器根据功能分为不同类别。随机访问迭代器(例如来自 vector 的迭代器)支持算术运算,例如 it + 3 或 it1 - it2。

双向迭代器(来自 list、map)可以用 ++ 和 -- 向前和向后移动。前向迭代器只能朝一个方向移动。

要反向遍历,请使用 rbegin() 和 rend():

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // 按相反顺序输出
}
challenge icon

挑战

简单

让我们构建一个库存跟踪系统,使用迭代器遍历和操作物品集合。你将练习使用不同类型的迭代器,以各种方式遍历数据。

你将把代码分到两个文件中:

  • Inventory.h:定义一个 Inventory 类,用于管理存储在 std::vector<int> 中的物品数量集合。

    你的类应提供以下方法:

    • addItem(int quantity):将物品数量添加到库存中
    • printForward():使用 begin() 和 end() 迭代器打印所有数量,数量之间用空格分隔,并在末尾换行
    • printReverse():使用 rbegin() 和 rend() 反向迭代器按相反顺序打印所有数量,数量之间用空格分隔,并在末尾换行
    • doubleAll():使用迭代器遍历向量,并将每个数量就地翻倍
    • getTotal():使用迭代器计算并返回所有数量的总和

    使用 auto 关键字声明迭代器,让代码保持简洁。

  • main.cpp:读取 4 个整数输入(每个输入单独占一行),表示物品数量。

    创建一个 Inventory,并添加这 4 个数量。然后通过以下操作演示迭代器的用法:

    1. 打印 Forward:,然后调用 printForward()
    2. 打印 Reverse:,然后调用 printReverse()
    3. 使用 getTotal() 打印 Total: <sum>
    4. 调用 doubleAll() 修改这些数量
    5. 打印 After doubling:,然后调用 printForward()
    6. 使用 getTotal() 打印 New total: <sum>

例如,输入 10、25、15 和 30 时:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

这个挑战能让你练习通过迭代器读取元素(用于打印和求和),以及通过迭代器修改元素(用于翻倍)。你还会看到,反向迭代器可以让反向遍历变得简单,无需操作索引。

亲手试试

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // 读取四个整数输入
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: 创建一个 Inventory 对象

    // TODO: 将四个数量都添加到库存中

    // TODO: 输出 "Forward: ",然后调用 printForward()

    // TODO: 输出 "Reverse: ",然后调用 printReverse()

    // TODO: 输出 "Total: ",后面接上 getTotal() 的结果

    // TODO: 调用 doubleAll() 修改数量

    // TODO: 输出 "After doubling: ",然后调用 printForward()

    // TODO: 输出 "New total: ",后面接上 getTotal() 的结果

    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器