推荐答案
在 C++11 中,基于范围的 for 循环(range-based for loop)提供了一种简洁的方式来遍历容器或数组中的元素。其基本语法如下:
for (declaration : range) {
// 循环体
}declaration:定义一个变量,用于存储当前遍历到的元素。range:表示要遍历的容器或数组。
示例代码
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用基于范围的 for 循环遍历 vector
for (int val : vec) {
std::cout << val << " ";
}
return 0;
}输出结果:
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
使用引用修改容器元素
// www.javascriptcn.com code example
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int& val : vec) {
val *= 2; // 修改容器中的元素
}
for (int val : vec) {
std::cout << val << " ";
}输出结果:
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 中极大地简化了遍历容器和数组的代码,提高了代码的可读性和简洁性。