推荐答案
在 C++11 中,基于范围的 for 循环(range-based for loop)提供了一种简洁的方式来遍历容器或数组中的元素。其基本语法如下:
for (declaration : range) { // 循环体 }
declaration
:定义一个变量,用于存储当前遍历到的元素。range
:表示要遍历的容器或数组。
示例代码
-- -------------------- ---- ------- -------- ---------- -------- -------- --- ------ - ---------------- --- - --- -- -- -- --- -- ------- --- ---- ------ --- ---- --- - ---- - --------- -- --- -- - -- - ------ -- -
输出结果:
1 2 3 4 5
本题详细解读
1. 语法解析
基于范围的 for 循环的语法非常简洁,主要由两部分组成:
declaration:定义一个变量,用于存储当前遍历到的元素。这个变量可以是值类型、引用类型或常量引用类型。
- 值类型:
for (int val : vec)
,每次循环时,val
是vec
中元素的副本。 - 引用类型:
for (int& val : vec)
,val
是vec
中元素的引用,可以直接修改容器中的元素。 - 常量引用类型:
for (const int& val : vec)
,val
是vec
中元素的常量引用,不能修改容器中的元素。
- 值类型:
range:表示要遍历的容器或数组。
range
必须是一个可以返回迭代器的对象,比如标准库中的容器(std::vector
、std::list
等)或原生数组。
2. 使用场景
基于范围的 for 循环适用于以下场景:
- 遍历标准库容器:如
std::vector
、std::list
、std::map
等。 - 遍历原生数组:可以直接遍历数组中的元素。
- 遍历自定义容器:如果自定义容器实现了
begin()
和end()
方法,也可以使用基于范围的 for 循环。
3. 注意事项
- 性能考虑:如果遍历的是大型对象,使用引用类型(
&
)可以避免不必要的拷贝,提高性能。 - 常量性:如果不需要修改容器中的元素,建议使用常量引用(
const&
)来避免意外的修改。 - 空容器:如果容器为空,基于范围的 for 循环不会执行循环体。
4. 示例扩展
遍历数组
int arr[] = {10, 20, 30, 40, 50}; for (int val : arr) { std::cout << val << " "; }
输出结果:
10 20 30 40 50
使用引用修改容器元素
-- -------------------- ---- ------- ---------------- --- - --- -- -- -- --- --- ----- --- - ---- - --- -- -- -- -------- - --- ---- --- - ---- - --------- -- --- -- - -- -
输出结果:
2 4 6 8 10
遍历 std::map
#include <map> std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}, {"cherry", 3}}; for (const auto& pair : m) { std::cout << pair.first << ": " << pair.second << std::endl; }
输出结果:
apple: 1 banana: 2 cherry: 3
通过以上示例可以看出,基于范围的 for 循环在 C++11 中极大地简化了遍历容器和数组的代码,提高了代码的可读性和简洁性。