0

0

C++中foreach循环怎么写_C++11基于范围的for循环用法【效率】

冰火之心

冰火之心

发布时间:2026-02-06 14:52:36

|

129人浏览过

|

来源于php中文网

原创

C++11未提供foreach关键字,但引入基于范围的for循环;语法为for (auto& x : container),推荐const auto&避免拷贝,容器需支持begin()/end(),且不可在循环中增删元素。

c++中foreach循环怎么写_c++11基于范围的for循环用法【效率】

C++11 没有 foreach 关键字,但提供了基于范围的 for 循环(range-based for),语法简洁、语义清晰,且在绝大多数场景下效率不输传统 for

基本写法:用 for (auto& x : container) 遍历容器

这是最常用、最安全的写法。注意三点:

  • auto& 表示引用,避免拷贝;若只读,推荐 const auto&
  • 容器必须支持 begin()end()(标准容器、C 风格数组、std::initializer_list 都满足)
  • 不能在循环中增删元素(会令迭代器失效,行为未定义)

示例:

std::vector v = {1, 2, 3};
for (const auto& x : v) {
    std::cout << x << " "; // 输出:1 2 3
}

什么时候该用 autoauto& 还是 auto&&

类型推导直接影响性能和正确性:

立即学习C++免费学习笔记(深入)”;

  • auto x → 值拷贝:对 std::stringstd::vector 等重型对象开销明显
  • auto& x → 左值引用:可读可写,适用于需修改原元素的场景
  • const auto& x → 只读引用:零拷贝、最常用,尤其遍历只读容器时
  • auto&& x → 万能引用:能绑定左值/右值,适合泛型代码或接收临时对象,但日常遍历中不必要

别写 for (auto x : v) 遍历 std::string —— 每次都触发深拷贝。

ThinkAny
ThinkAny

一个RAG驱动的AI搜索引擎,由独立开发者idoubi开发

下载

效率对比:和传统 for (size_t i = 0; i 一样快吗?

在开启优化(-O2)时,现代编译器(GCC/Clang/MSVC)对两者生成的汇编几乎完全一致,前提是:

  • 容器是标准类型(如 std::vectorstd::array
  • 没有在循环体内取地址或做复杂别名分析干扰
  • 没禁用 operator[] 内联或 size() 缓存(如自定义容器未将 size() 声明为 noexceptconstexpr,可能影响优化)

例外:C 风格数组 int a[10]for (auto& x : a) 直接展开为下标访问,无函数调用开销;而手写 for (int i = 0; i 也很快,但需手动维护长度。

常见陷阱:这些地方一写就崩

实际编码中最容易翻车的几个点:

  • 对空容器使用 for (auto& x : *ptr),而 ptrnullptr → 解引用崩溃,begin()/end() 不做空指针检查
  • std::map::iterator 当成值来遍历:for (auto p : my_map) 得到的是 std::pair,不是 iterator;想用迭代器就得用传统 for
  • 在循环中调用 push_back()erase() → 迭代器失效,UB;必须改用索引或 erase-remove 惯用法
  • 用在非标准类型上却没提供 begin()/end() → 编译失败;可通过 ADL 或定义自由函数补全

真正难处理的从来不是语法,而是「什么时候不该用它」——尤其是涉及生命周期、所有权转移或容器结构变更时,range-based for 会悄悄掩盖问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

139

2025.12.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

537

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

153

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

204

2025.08.29

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

33

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号