C++中的based for 循环

devtools/2025/2/8 8:41:23/

文章目录

      • 范围基 `for` 循环(Range-based `for` Loop)
      • 语法格式
      • 例子
        • 1. 遍历数组
        • 2. 遍历 `std::vector`
        • 3. 使用引用避免拷贝
        • 4. 使用常量引用
      • 特殊用法
        • 5. 遍历 `std::map` 或 `std::unordered_map`
      • 总结


在 C++ 中,based for 循环并不是一种标准的语法,可能是你想询问的实际上是 范围基(range-based)for 循环。这种循环语法是在 C++11 中引入的,旨在简化遍历容器(如数组、std::vectorstd::map 等)的代码。

范围基 for 循环(Range-based for Loop)

范围基 for 循环用于遍历容器或数组中的所有元素,而不需要显式地使用索引或迭代器。它的语法非常简洁,适用于任何可以迭代的容器。

语法格式

for (declaration : container) {// 循环体
}
  • declaration:每次迭代时,容器中的一个元素会被赋值给这个声明的变量。可以是引用类型,以避免不必要的拷贝。
  • container:可以是一个数组、容器(如 std::vectorstd::liststd::map 等)或其他可迭代的数据结构。

例子

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

输出:

1 2 3 4 5

在这个例子中,num 会依次获取数组中的每个元素,直到遍历完整个数组。

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

输出:

10 20 30 40 50
3. 使用引用避免拷贝

如果容器中的元素是较大的对象,或者你不希望拷贝元素,使用引用来避免不必要的拷贝。

#include <iostream>
#include <vector>class Person {
public:std::string name;Person(std::string n) : name(n) {}
};int main() {std::vector<Person> people = {Person("Alice"), Person("Bob"), Person("Charlie")};// 使用引用避免拷贝for (Person& p : people) {std::cout << p.name << " ";}return 0;
}

输出:

Alice Bob Charlie
4. 使用常量引用

如果不需要修改容器中的元素,可以使用常量引用来提高效率(避免不必要的拷贝,并保护数据不被修改)。

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用常量引用,避免拷贝且不修改元素for (const int& num : vec) {std::cout << num << " ";}return 0;
}

输出:

1 2 3 4 5

特殊用法

5. 遍历 std::mapstd::unordered_map

对于 std::mapstd::unordered_map,每个元素都是一个键值对,因此迭代时需要使用 auto 来推导类型。

#include <iostream>
#include <map>int main() {std::map<int, std::string> m = {{1, "One"}, {2, "Two"}, {3, "Three"}};// 遍历 map(键值对)for (const auto& pair : m) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}return 0;
}

输出:

Key: 1, Value: One
Key: 2, Value: Two
Key: 3, Value: Three

总结

范围基 for 循环 是一种简洁、直观的方式来遍历容器,它:

  • 简化代码:不需要显式地使用迭代器或索引。
  • 提高可读性:代码更加简洁易懂。
  • 减少错误:避免了手动操作索引或迭代器。
  • 性能优化:可以使用引用来避免不必要的元素拷贝,尤其是在处理较大数据类型时。

使用范围基 for 循环,可以极大地提高代码的简洁性和可读性,尤其是在需要遍历容器时。


http://www.ppmy.cn/devtools/157054.html

相关文章

Jmeter接口自动化测试

之前我们的用例数据都是配置在HTTP请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开JMeter重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f;我们可以将用例的数据存放在cs…

某团面试题①—kudu读写流程

kudu 读写流程 前言 为什么会有kudu&#xff1f;先贴一个经典的图。 kudu诞生之前大数据的主要2种方式存储 静态数据 以hdfs引擎作为存储引擎&#xff0c;适用于高吞吐量的离线大数据分析场景&#xff0c;缺点是实现随机读写性能差&#xff0c;更新数据难 动态数据 以Hbase…

利用真值表法求取主析取范式及主合取范式

利用真值表法求取主析取范式及主合取范式 程序结构 ├─ code │ ├─logical_operation │ │ ├─__init__.py │ │ ├─Algorithm.py │ │ └─operator.py │ └─main.pycode&#xff1a;主程序文件夹 logical_operation&#xff1a;定义与逻辑运算有关的符号…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

【高级架构师】计算机网络基础:第二章 计算机网络体系结构(上)

文章目录 第二章 计算机网络体系结构2.1 常用的计算机网络体系结构2.1.1 OSI体系结构2.1.2 具有五层协议的体系结构 2.2 物理层2.2.1 物理层的基本概念2.2.2 传输媒体 2.3 数据链路层2.3.1 数据链路层概述2.3.2 封装成帧2.3.3 透明传输2.3.4 差错校验2.3.4 以太网2.3.5 以太网的…

StarSpider 星蛛 爬虫 Java框架 可以实现 lazy爬取 实现 HTML 文件的编译,子标签缓存等操作

StarSpider 星蛛 爬虫 Java框架 开源技术栏 StarSpider 能够实现 针对 HTML XSS SQL 数学表达式等杂乱数据的 爬取 解析 提取 需求&#xff01; 目录 文章目录 StarSpider 星蛛 爬虫 Java框架目录介绍如何获取&#xff1f;maven配置 架构是什么样的&#xff1f;结果对象的类…

MATLAB | 基于Theil-Sen斜率和Mann-Kendall检验的栅格数据趋势分析

最近看到一些博主分享关于 SenMK 检验的代码&#xff0c;对于新手来说可能有点复杂。我们编写了一段 MATLAB 代码&#xff0c;能够一次性解决这些问题&#xff0c;简化操作流程。我们还准备了几个关于趋势检验的空间分布图&#xff0c;供大家参考。 一、Sens Slope和Mann-Kenda…

【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计FIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计FIR数字滤波器&#xff08;保姆级教程&#xff09; 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入"filterDesigner"&#xff0c;接着就会跳出以下界面&#xf…