迭代器
本课属于 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 << " "; // 按相反顺序输出
}挑战
简单让我们构建一个库存跟踪系统,使用迭代器遍历和操作物品集合。你将练习使用不同类型的迭代器,以各种方式遍历数据。
你将把代码分到两个文件中:
Inventory.h:定义一个Inventory类,用于管理存储在std::vector<int>中的物品数量集合。你的类应提供以下方法:
addItem(int quantity):将物品数量添加到库存中printForward():使用begin()和end()迭代器打印所有数量,数量之间用空格分隔,并在末尾换行printReverse():使用rbegin()和rend()反向迭代器按相反顺序打印所有数量,数量之间用空格分隔,并在末尾换行doubleAll():使用迭代器遍历向量,并将每个数量就地翻倍getTotal():使用迭代器计算并返回所有数量的总和
使用
auto关键字声明迭代器,让代码保持简洁。main.cpp:读取 4 个整数输入(每个输入单独占一行),表示物品数量。创建一个
Inventory,并添加这 4 个数量。然后通过以下操作演示迭代器的用法:- 打印
Forward:,然后调用printForward() - 打印
Reverse:,然后调用printReverse() - 使用
getTotal()打印Total: <sum> - 调用
doubleAll()修改这些数量 - 打印
After doubling:,然后调用printForward() - 使用
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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器