当前位置: 首页 > news >正文

C++中的for-each循环

文章目录

      • 基本语法
      • 举例说明
        • 1. 遍历数组
        • 2. 遍历`std::vector`
        • 3. 遍历容器中的对象
        • 4. 使用引用修改元素
        • 5. 使用`const`保护元素
      • 范围循环的使用注意事项
      • 总结

C++中的范围循环(Range-based for loop),也称为for-each循环,是C++11引入的一种简化数组或容器遍历的循环方式。相比传统的for循环,for-each更加简洁且不容易出错,特别是在遍历STL容器时。

基本语法

范围循环的语法结构如下:

for (declaration : range_expression) {// loop body
}
  • declaration:用于定义循环中的迭代变量(类似于传统for循环中的计数器)。
  • range_expression:需要遍历的容器、数组或范围。

举例说明

我们通过几个例子来讲解范围循环的使用。

1. 遍历数组
#include <iostream>int main() {int arr[] = {1, 2, 3, 4, 5};// 使用范围循环遍历数组for (int num : arr) {std::cout << num << " ";}return 0;
}

输出:

1 2 3 4 5

在这个例子中,int num 是声明的循环变量,它会依次获取arr数组中的每一个元素。

2. 遍历std::vector
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {10, 20, 30, 40, 50};// 使用范围循环遍历 vectorfor (int num : vec) {std::cout << num << " ";}return 0;
}

输出:

10 20 30 40 50

与遍历数组类似,这里通过范围循环可以简洁地遍历std::vector中的元素。

3. 遍历容器中的对象

范围循环不仅可以遍历简单的基本类型数组或容器,也可以用来遍历容器中的对象:

#include <iostream>
#include <vector>struct Person {std::string name;int age;
};int main() {std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};// 使用范围循环遍历对象for (const Person& person : people) {std::cout << person.name << ": " << person.age << "\n";}return 0;
}

输出:

Alice: 25
Bob: 30
Charlie: 35
4. 使用引用修改元素

范围循环可以通过引用访问元素,从而对容器中的元素进行修改。如果不使用引用,循环中得到的只是元素的副本,无法对原数组或容器中的元素进行修改。

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用引用来修改元素for (int& num : vec) {num *= 2;  // 将每个元素翻倍}// 输出修改后的容器for (int num : vec) {std::cout << num << " ";}return 0;
}

输出:

2 4 6 8 10

通过int& num,我们可以访问并修改vec容器中的每个元素。

5. 使用const保护元素

有时候我们不希望在循环中修改元素,可以使用const来确保元素不会被修改:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {10, 20, 30, 40, 50};// 使用 const 来防止修改元素for (const int& num : vec) {std::cout << num << " ";}return 0;
}

这里的const int&确保了num只是一个只读的引用,无法在循环内部对其进行修改。

范围循环的使用注意事项

  1. 迭代副本与引用

    • 如果在范围循环中不使用引用(如for (int num : vec)),则会遍历每个元素的副本,无法对原数组或容器进行修改。
    • 如果使用引用(如for (int& num : vec)),则可以直接修改原数组或容器的元素。
  2. 常量性保护

    • 通过使用const关键字,可以确保元素在循环中不会被修改,确保数据的安全性。
  3. 适用范围

    • 范围循环适用于所有可以使用begin()end()方法的容器,例如数组、std::vectorstd::liststd::set等STL容器。
  4. 不可用于某些C++98容器

    • C++98/03标准中的某些自定义容器没有提供begin()end()方法,因此无法直接使用范围循环。

总结

范围循环是C++中遍历容器、数组的一种简洁、直观的方式,能减少代码的复杂度,提高代码的可读性。通过对引用与常量的合理使用,可以更灵活地控制数据访问与修改。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 设计模式】Listener模式和Visitor模式的区别
  • Android 设计模式
  • python画图|3D垂线标记
  • HT5169 内置BOOST升压的11WI2S输入D类音频功放
  • wangeditor——cdn引入的形式创建一个简易版编辑器——js技能提升
  • 从状态管理到性能优化:全面解析 Android Compose
  • 【 前端优化】Vue 3 性能优化技巧
  • 二叉树(上)
  • 2.大语言模型LLM的涌现能力和关键技术
  • JVM面试(七)G1垃圾收集器剖析
  • css问题:display:flex布局+justify-content: space-between; 最后一行不能左对齐
  • 2024年重磅报告!国内AI大模型产业飞速发展!
  • APO使用场景之:统一的指标采集展示
  • Android SPN/PLMN 显示逻辑简介
  • 图算法 | 图算法的分类有哪些?(下)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017-09-12 前端日报
  • Angularjs之国际化
  • CentOS从零开始部署Nodejs项目
  • codis proxy处理流程
  • EventListener原理
  • Java-详解HashMap
  • js学习笔记
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL几个简单SQL的优化
  • npx命令介绍
  • Promise面试题2实现异步串行执行
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 闭包--闭包作用之保存(一)
  • 程序员最讨厌的9句话,你可有补充?
  • 搭建gitbook 和 访问权限认证
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分布式熔断降级平台aegis
  • 关于extract.autodesk.io的一些说明
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 思维导图—你不知道的JavaScript中卷
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 国内开源镜像站点
  • ​字​节​一​面​
  • $.each()与$(selector).each()
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二)原生js案例之数码时钟计时
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (生成器)yield与(迭代器)generator
  • (十)Flink Table API 和 SQL 基本概念
  • (数据结构)顺序表的定义
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .cfg\.dat\.mak(持续补充)
  • .NET CLR基本术语
  • .net dataexcel 脚本公式 函数源码
  • .net 简单实现MD5
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net开发日常笔记(持续更新)