C++--范围for循环详解

范围 for 循环是 C++11 引入的语法特性,用于简化遍历容器或数组元素的过程。它比传统 for 循环更简洁安全,特别适合初学者。以下是详细讲解:


基本语法

for (元素类型 变量名 : 容器/数组) {// 循环体(使用变量名访问当前元素)
}

或使用 auto 自动推断类型:

for (auto 变量名 : 容器/数组) {// 循环体
}

与普通 for 循环对比

传统遍历向量的方式:

for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{// 使用 *it 访问元素
}

范围 for 循环更简洁,可读性更强,且不易出错(如避免了迭代器越界等问题)。


关键特点

  1. 自动遍历:无需手动控制索引或迭代器
  2. 边界安全:自动处理开始和结束位置,避免越界
  3. 简洁性:代码更易读,减少错误

底层原理

范围 for 循环会遍历给定容器(或数组)中的每一个元素。在每次迭代中,它会将当前元素复制到循环变量中(注意:这里是复制)。如果你希望避免复制,特别是当容器元素较大时,可以使用引用(如 auto&const auto&)。

编译器将范围 for 转换为迭代器操作:

// 原始代码
for (auto x : container) { ... }// 等效的传统代码
for (auto it = begin(container); it != end(container); ++it) {auto x = *it;  // 注意:这里是值拷贝!...
}

使用示例

示例 1:遍历数组
int numbers[] = {10, 20, 30, 40};// 传统 for 循环
for (int i = 0; i < 4; ++i) {cout << numbers[i] << " ";
}// 范围 for 循环(更简洁!)
for (int num : numbers) {cout << num << " ";
}
// 输出:10 20 30 40
示例 2:遍历 vector
#include <vector>
#include <iostream>
using namespace std;int main() {vector<string> fruits = {"Apple", "Banana", "Cherry"};// 使用 auto 自动推断类型for (auto fruit : fruits) {cout << fruit << " ";}// 输出:Apple Banana Cherry
}

修改元素(使用引用)

若需修改容器中的元素,需使用引用 &

vector<int> scores = {80, 90, 70};// 给每个成绩加10分
for (auto& score : scores) {  // 注意 & 符号score += 10;
}// 验证结果
for (auto s : scores) {cout << s << " ";  // 输出:90 100 80
}

只读场景(使用 const 引用)

当不需要修改元素时,使用 const auto& 避免复制开销:

vector<string> names = {"Alice", "Bob", "Charlie"};// 高效只读访问(尤其对大型对象)
for (const auto& name : names) {cout << name.length() << " ";  // 输出:5 3 7
}

支持的数据类型

范围 for 循环可用于:

  • 原生数组(如 int arr[5]
  • STL 容器(vector, list, map, set 等)
  • 自定义类型(需实现 begin()end() 成员函数)
  • 初始化列表(如 {1,2,3}

注意事项

  1. 容器必须支持迭代器:范围 for 循环内部使用迭代器,因此容器必须具有 begin()end() 成员函数,或者是数组。

  2. 不能修改容器结构:在范围 for 循环中,不能添加或删除容器中的元素,否则可能导致迭代器失效,引发未定义行为。

  3. 元素访问方式

  • 使用 auto:创建元素的副本(适用于基本类型或需要修改但不影响原容器的情况)。

  • 使用 auto&:引用元素,可以修改元素(修改会影响原容器)。

  • 使用 const auto&:常量引用,只读且避免复制(适用于大对象或只读遍历)。


经典应用场景

  1. 遍历数组/容器处理数据
  2. 配合 STL 算法快速操作
  3. 处理字符串字符:
    string msg = "Hello";
    for (char c : msg) {cout << c << "-";  // 输出:H-e-l-l-o-
    }
    

建议:在 C++11 及以上版本中,优先使用范围 for 替代传统 for 循环,代码更简洁安全。掌握后你会爱上它!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDMA简介1之RDMA开发必要性

为了满足大批量数据的采集、存储与传输需求&#xff0c;越来越多的数据密集型应用如机器学习、雷达、金融风控、航空航天等选择使用现场可编程逻辑门阵列作为数据采集前端硬件来实现高性能的数据采集系统。FPGA凭借其高灵活性、高并行能力及可高度定制化的特点&#xff0c;能够…

xmake的简易学习

文章目录 1. xmake是什么2. 一个可执行程序3. 一个库文件4. 遍历文件用法5. 第三方库3.1 系统安装库3.2 独立库 6. 后续 由于前一篇博客的最后说要做一些rknn的优化&#xff0c;其实这个工作很早就完成了&#xff0c;但是我是使用 xmake这个来做我的工程的构建的&#xff0c;不…

【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程

文章目录 一、软件功能二、下载地址三、安装教程Geographic Imager地图工具使Adobe Photoshop空间图像可以快速高效地工作。它增加了导入,编辑,操作和导出地理空间图像的工具,例如航空和卫星图像。Geographic Imager Mac功能非常强大,拥有栅格数据输出、投影信息修改、基于…

【 java 集合知识 第一篇 】

1.概念 1.1.集合与数组的区别 集合&#xff1a;长度不固定&#xff0c;动态的根据数据添加删除改变长度&#xff0c;并且只能存入引用类型&#xff0c;读取采用迭代器或其他方法 数组&#xff1a;长度固定&#xff0c;不可改变&#xff0c;既可以存入基本类型也可以存入引用…

嵌入式开发学习日志(linux系统编程--系统编程之 进程间通信IPC)Day32

一、引言 空间独立&#xff0c;需要一些操作&#xff1b; 分为三大类&#xff1a; 1、古老的通信方式 无名管道 有名管道 信号 2、IPC对象通信 system v BSD suse fedora kernel.org 消息队列(用的相对少&#xff0c;这里不讨论) …

metersphere不同域名的参数在链路测试中如何传递?

域名1&#xff1a;https://api.domain1.com 域名2&#xff1a;https://api.domain2.com 域名1的返回参数stteid会作为域名2的入参 步骤&#xff1a; 1&#xff09;先在metersphere—接口测试—接口定义中创建域名1和域名2的接口 2&#xff09;接口创建好后&#xff0c;在接口测…

使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查软件高CPU占用问题

目录 1、问题现象 2、使用Process Explorer和System Informer&#xff08;该工具原先叫Process Hacker&#xff09;查看占用CPU高的线程 3、使用System Informer工具时发现了一个关键细节 4、将Windbg附加到软件进程上&#xff0c;根据System Informer中显示的线程id到Wind…

Linux(线程概念)

目录 一 虚拟地址到物理地址的转换 1. 操作系统如何管理物理内存&#xff1a; 2. 下面来谈谈虚拟地址如何转换到物理地址&#xff1a; 3. 补充字段&#xff1a; 二 Linux中的线程 1. 先来说说进程&#xff1a; 2. 线程&#xff1a; 3. 线程相比较于进程的优缺点&#x…

阿里云为何,一个邮箱绑定了两个账号

阿里云“幽灵账号”之谜&#xff1a;同一个邮箱注销后仍有两个账号&#xff1f;深度揭秘成因与终极解决方案&#xff01; 你是否曾在阿里云上使用同一个邮箱注册过多个账号&#xff0c;明明已经**“彻底”注销了其中一个**&#xff0c;却惊愕地发现系统里依然**“幽灵般”挂着…

动态规划-数位DP

今天开始做关于数位DP的问题&#xff0c;首先对于数位DP来说&#xff0c;这类问题难度较大&#xff0c;比较难理解&#xff0c;所以博主也会尽量讲的更加详细一些&#xff0c;来帮助大家更好地理解这里的相关知识。 前置知识&#xff1a; 1.首先对于数位DP来说&#xff0c;主…

总览四级考试

别被“四级”这个庞然大物吓到&#xff01;我们一起拆解它&#xff1a;​​ &#x1f4cd; ​​核心认知&#xff1a;四级是一场策略性考试&#xff01;​​ 它不考智商&#xff0c;考的是​​基础英语能力 考试技巧 时间管理​​。基础可以通过努力补&#xff0c;技巧可以…

BSRR对比BRR对比ODR

✅ 三种操作方式的本质区别 寄存器功能原子操作特点BSRR同时支持置位(1)和复位(0)✔️ 是单指令完成任意位操作&#xff0c;无竞争风险ODR直接读写输出状态❌ 否需"读-改-写"&#xff0c;多线程/中断中需关中断保护BRR只能复位(0)✔️ 是仅清零功能&#xff0c;无置…

职坐标精选嵌入式AI物联网开源项目

随着嵌入式、AI与物联网技术的深度融合&#xff0c;开源生态已成为开发者构建智能硬件解决方案的核心驱动力。本文将从嵌入式实时操作系统、多模态AI数据集及物联网接入平台三大维度切入&#xff0c;系统性梳理技术选型要点与实践路径。在嵌入式领域&#xff0c;重点解析低功耗…

Ubuntu系统 | 本地部署ollama+deepseek

1、Ollama介绍 Ollama是由Llama开发团队推出的开源项目,旨在为用户提供高效、灵活的本地化大型语言模型(LLM)运行环境。作为Llama系列模型的重要配套工具,Ollama解决了传统云服务对计算资源和网络连接的依赖问题,让用户能够在个人电脑或私有服务器上部署和运行如Llama 3等…

【数据库】关系数据库标准语言-SQL(金仓)下

4、数据查询 语法&#xff1a; SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <…

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破

【导读】 应对气候变化对非洲象的生存威胁&#xff0c;本研究创新采用无人机航拍结合AI姿态分析技术&#xff0c;突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型&#xff0c;首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…

8.RV1126-OPENCV 视频中添加LOGO

一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能&#xff0c;然后创建两个线程&#xff1a;1.把LOGO灰度化&#xff0c;然后获取VI原始数据&#xff0c;其次把VI数据Mat化并创建一个感兴趣区域&#xff0c;最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…

AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度

在工业自动化浪潮席卷全球的当下&#xff0c;仓储物流环节的效率与精准度成为企业降本增效的关键战场。其中&#xff0c;塑料袋拆垛作为高频、高重复性的作业场景&#xff0c;传统人工或机械臂操作面临着诸多挑战。迁移科技&#xff0c;作为行业领先的 3D 工业相机和 3D 视觉系…

MATLAB实战:视觉伺服控制实现方案

以下是一个基于MATLAB的视觉伺服控制项目实现方案&#xff0c;结合实时图像处理、目标跟踪和控制系统设计。我们将使用模拟环境进行演示&#xff0c;但代码结构可直接应用于真实硬件。 系统架构 图像采集 → 目标检测 → 误差计算 → PID控制器 → 执行器控制 完整代码实现 …

RequestRateLimiterGatewayFilterFactory

一、功能说明 RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制组件&#xff0c;用于实现 API 请求速率限制&#xff0c;核心功能包括&#xff1a; 限制单位时间内的请求数量&#xff08;如每秒10次&#xff09;防止服务被突发流量击垮&#xff0…