导读:本期聚焦于小伙伴创作的《C++中foreach循环怎么写?C++11基于范围的for循环用法和效率如何》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中foreach循环怎么写?C++11基于范围的for循环用法和效率如何》有用,将其分享出去将是对创作者最好的鼓励。

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

C++中foreach循环怎么写?C++11基于范围的for循环用法和效率如何

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()方法的容器,包括标准库容器如vectormapset等,也支持原生数组和初始化列表。

使用时需要注意以下几点:

  • 遍历的序列必须在循环开始前确定长度,循环中不能修改序列的大小,比如不能在遍历vector时执行push_back操作,否则会导致未定义行为。
  • 如果序列的元素类型是自定义类,且没有定义拷贝构造函数,使用值类型遍历会编译失败,此时需要使用引用类型。
  • 遍历map容器时,变量名是pair类型,需要通过firstsecond访问键和值:
#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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。