C++11标准引入了基于范围的for循环,也就是开发者常说的foreach循环,它可以简化容器、数组等序列的遍历操作,不需要手动定义迭代器或者索引变量,让遍历代码更加简洁易读。这种循环可以直接遍历序列中的每个元素,语法形式固定,适配多种常见的数据结构。

C++11基于范围的for循环基本语法
基于范围的for循环的基本语法格式如下:
// 语法格式
for (元素类型 变量名 : 序列) {
// 循环体,变量名就是当前遍历到的元素
}
// 遍历普通数组示例
int arr[] = {1, 2, 3, 4, 5};
for (int num : arr) {
// num依次取数组中的每个元素
printf("%d ", num);
}
// 输出结果:1 2 3 4 5
如果需要在循环中修改元素的值,可以使用引用类型作为变量名,避免元素的拷贝操作:
int arr[] = {1, 2, 3, 4, 5};
// 使用引用修改数组元素
for (int& num : arr) {
num *= 2;
}
for (int num : arr) {
printf("%d ", num);
}
// 输出结果:2 4 6 8 10
适用场景和注意事项
基于范围的for循环可以遍历所有支持begin()和end()方法的容器,包括标准库容器如vector、map、set等,也支持原生数组和初始化列表。
使用时需要注意以下几点:
- 遍历的序列必须在循环开始前确定长度,循环中不能修改序列的大小,比如不能在遍历
vector时执行push_back操作,否则会导致未定义行为。 - 如果序列的元素类型是自定义类,且没有定义拷贝构造函数,使用值类型遍历会编译失败,此时需要使用引用类型。
- 遍历
map容器时,变量名是pair类型,需要通过first和second访问键和值:
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main() {
map<string, int> score_map = {{"张三", 90}, {"李四", 85}};
// 遍历map
for (auto& item : score_map) {
cout << item.first << "的成绩是:" << item.second << endl;
}
return 0;
}
效率分析
很多开发者关心基于范围的for循环和传统for循环的效率差异,实际上在开启编译器优化的情况下,两者的效率几乎一致。我们可以通过一个简单的测试对比:
#include <vector>
#include <chrono>
#include <iostream>
using namespace std;
using namespace chrono;
int main() {
vector<int> vec(1000000, 1);
// 传统for循环测试
auto start1 = high_resolution_clock::now();
int sum1 = 0;
for (int i = 0; i < vec.size(); i++) {
sum1 += vec[i];
}
auto end1 = high_resolution_clock::now();
auto duration1 = duration_cast<microseconds>(end1 - start1);
// 基于范围的for循环测试
auto start2 = high_resolution_clock::now();
int sum2 = 0;
for (int num : vec) {
sum2 += num;
}
auto end2 = high_resolution_clock::now();
auto duration2 = duration_cast<microseconds>(end2 - start2);
cout << "传统for循环耗时:" << duration1.count() << "微秒" << endl;
cout << "基于范围的for循环耗时:" << duration2.count() << "微秒" << endl;
return 0;
}
在-O2优化下,两种循环的运行时间差异极小,因为编译器会将基于范围的for循环优化成和传统for循环类似的汇编指令。如果遍历时使用值类型且元素是大对象,会产生拷贝开销,此时使用引用类型遍历可以避免拷贝,进一步提升效率。
总结
C++11的基于范围的for循环是传统foreach循环的替代实现,语法简洁,可读性强,在大部分遍历场景下都可以替代传统for循环。只要注意避免在循环中修改序列大小、根据需求选择值类型或引用类型遍历,就能在保持代码简洁的同时,获得和传统for循环一致的效率。对于不需要修改元素、元素类型较小的场景,值类型遍历即可;对于需要修改元素或者元素类型较大的场景,使用引用类型遍历更合适。
C++11基于范围的for循环foreach循环代码效率修改时间:2026-07-15 12:36:29