新遍历方法
学习定位:现代 C++ 核心知识。遍历容器是日常代码高频操作,现代写法优先使用范围 for、结构化绑定和标准库算法,让循环意图更清楚。
1. 范围 for
只读遍历:
std::vector<int> values{1, 2, 3};
for (const auto& value : values) {
std::cout << value << '\n';
}需要修改元素:
for (auto& value : values) {
value *= 2;
}简单标量也可以按值:
for (int value : values) {
std::cout << value << '\n';
}2. 结构化绑定遍历
遍历 map、unordered_map 或返回 pair/tuple 的范围时,C++17 的结构化绑定更清楚:
std::map<std::string, int> scores{{"Alice", 90}, {"Bob", 80}};
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}3. 标准库算法
当循环的意图是查找、计数、转换、删除时,优先考虑标准库算法:
auto it = std::find(values.begin(), values.end(), 3);
auto even_count = std::count_if(values.begin(), values.end(), [](int value) {
return value % 2 == 0;
});C++20 ranges 可以进一步减少迭代器样板:
auto it = std::ranges::find(values, 3);4. 选择建议
| 场景 | 推荐写法 |
|---|---|
| 顺序访问所有元素 | 范围 for |
| 需要元素下标 | 普通 for 或 std::views::enumerate(C++23) |
| 遍历键值对 | 结构化绑定 |
| 查找、计数、排序、转换 | 标准库算法 |
| 需要手动控制迭代器失效 | 显式迭代器循环 |
5. 总结
现代 C++ 遍历的重点不是“哪种循环最快”,而是让代码直接表达意图。先掌握范围 for 和算法,再在需要下标、删除元素或处理迭代器失效时使用传统写法。