【C++】探索C++11中的范围for循环与auto关键字


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯1. 范围for循环的基础用法
    • 1.1 什么是范围for循环?
    • 1.2 示例代码
      • 代码解析
    • 1.3 范围for的特点
      • 传统for循环与范围for循环对比
    • 1.4 使用引用修改元素
  • 💯2. `auto`关键字的基础用法
    • 2.1 什么是`auto`关键字?
    • 2.2 示例代码
      • 代码解析
    • 2.3 使用`auto`结合范围for循环
      • 优势
  • 💯3. `auto`的注意事项
  • 💯4. 小结


在这里插入图片描述


💯前言

  • C++11为C++语言引入了许多现代化的特性,其中范围for循环(range-based for loop)和auto关键字是两个备受欢迎的功能。这些特性极大地提升了代码的简洁性和可读性,同时减少了程序员在类型声明和遍历数据结构时的心智负担。本篇文章将详细解析范围for循环和auto关键字的用法,通过示例代码和扩展分析,帮助读者全面掌握这两个重要特性。
    C++ 参考手册
    在这里插入图片描述

💯1. 范围for循环的基础用法

1.1 什么是范围for循环?

范围for循环是C++11引入的一种语法糖,用于更方便地遍历容器或数组中的元素。相比传统的for循环,它更加简洁直观,特别适合需要访问容器中所有元素的场景。

基本语法:

for (声明 : 容器) {语句;
}
  • 声明:指定用于保存容器中当前遍历元素的变量。
  • 容器:可以是数组、std::vector等支持范围遍历的容器。

1.2 示例代码

以下是一个使用范围for循环遍历数组的简单例子:

#include <iostream>
using namespace std;int main() {int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };for (int e : arr) { // e 依次存储数组中的每个元素cout << e << " ";}return 0;
}

输出:

1 2 3 4 5 6 7 8 9 10

代码解析

  1. int arr[10]:初始化了一个包含10个整数的数组。
  2. for (int e : arr)
    • e是一个局部变量,每次循环依次从数组arr中提取当前元素的值。
    • 循环体中访问e不会改变数组本身。
  3. cout << e << " ":将每个元素打印在一行中,用空格分隔。

1.3 范围for的特点

  1. 语法简洁:不需要像传统for循环那样显式维护索引变量。
  2. 可读性高:代码更容易理解,减少了遍历逻辑的复杂性。
  3. 局限性:范围for会遍历容器中的所有元素,如果只需要处理部分元素或需要自定义遍历顺序,传统for循环可能更适合。

传统for循环与范围for循环对比

特性范围for传统for
语法简洁性简洁需要管理索引
灵活性遍历所有元素可自由定义遍历范围
可读性更高相对较低

1.4 使用引用修改元素

范围for循环默认对元素进行只读访问。如果需要修改容器中的元素,可以通过添加引用来实现:

#include <iostream>
using namespace std;int main() {int arr[5] = { 1, 2, 3, 4, 5 };for (int &e : arr) { // 使用引用对元素进行修改e *= 2; // 每个元素乘以2}for (int e : arr) {cout << e << " "; // 打印修改后的数组}return 0;
}

输出:

2 4 6 8 10

💯2. auto关键字的基础用法

2.1 什么是auto关键字?

auto关键字同样是C++11引入的,用于让编译器根据变量的初始化表达式自动推导出变量的类型。它特别适合用于类型较复杂的变量声明,或者在不清楚变量类型的情况下提高代码灵活性。

基本语法:

auto 变量名 = 初始化表达式;
  • 编译器会根据右侧的初始化表达式推导出变量的类型。
  • 初始化是必须的,编译器无法通过未初始化的变量推导类型。

2.2 示例代码

#include <iostream>
using namespace std;int main() {auto a = 3.14;  // 推导为 doubleauto b = 100;   // 推导为 intauto c = 'x';   // 推导为 charcout << "a: " << a << ", b: " << b << ", c: " << c << endl;return 0;
}

输出:

a: 3.14, b: 100, c: x

代码解析

  1. auto a = 3.14:变量a的类型被推导为double
  2. auto b = 100:变量b的类型被推导为int
  3. auto c = 'x':变量c的类型被推导为char

2.3 使用auto结合范围for循环

在范围for循环中,auto可以进一步简化代码,特别是在容器元素类型不确定时非常有用。

示例代码:

#include <iostream>
using namespace std;int main() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};for (auto e : arr) { // 自动推导 e 的类型为 intcout << e << " ";}return 0;
}

输出:

1 2 3 4 5 6 7 8 9 10

优势

  1. 减少类型声明的负担:尤其在处理复杂类型时,auto可以避免手动指定类型。
  2. 代码灵活性更高:如果数组元素的类型发生变化,使用auto的代码可以无需修改仍然保持有效。

💯3. auto的注意事项

  1. 必须初始化:auto关键字无法单独声明变量,必须通过初始化让编译器推导类型。

    auto x; // 错误:未初始化,无法推导类型
    
  2. 不要滥用:

    • 虽然auto可以简化代码,但过度使用可能降低代码可读性。
    • 例如:
      auto x = func(); // 如果不清楚func()的返回类型,代码会变得难以维护
      
  3. 类型推导的副作用:当需要保持constvolatile等限定符时,auto可能会丢失这些限定符。

    const int x = 10;
    auto y = x; // y 的类型为 int,而不是 const int
    

💯4. 小结

C++11中的范围for循环和auto关键字是现代C++编程中不可或缺的两大工具。范围for循环通过简化遍历逻辑,让代码更易读易维护;而auto关键字则减少了类型声明的复杂性,为开发者提供了更高的灵活性。在实际开发中,这两者可以相辅相成,大大提升代码的可读性和效率。

在学习和使用这些特性时,理解其设计初衷和使用场景是关键。在适当的场景下灵活应用这些工具,将让你的代码更加简洁、高效、现代化。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

mac下载Homebrew安装nvm

通过Homebrew安装 - 国内下载地址 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装nvm brew install nvm 配置nvm环境变量 export NVM_DIR“$HOME/.nvm” [ -s “/usr/local/opt/nvm/nvm.sh” ] && . “/usr/…

解決當前IP地址僅適用於本地網路

想要解決“當前IP地址僅適用於本地網路”其實並不困難。本篇文章將介紹其發生的原因以及如何解決。 “僅限本地網路”是什麼意思&#xff1f; 當IP地址為“僅限本地網路”時&#xff0c;意味著設備正在使用私人網路內部IP地址&#xff0c;但無法連接到互聯網。如果將本地IP視…

HANA数据库 XS 503 Service not available

http_url配置正确 在将单个数据库系统转换为多租户数据库容器系统之后&#xff0c;无法通过URL访问新租户数据库的独立XS引擎服务。调用相应的URL会产生这样的错误&#xff1a;503服务不可用 Solution &#xff08;启用租户数据库引擎的嵌套模式&#xff08;HDD不用&#xff…

【大模型实战篇】Mac本地部署RAGFlow的踩坑史

1. 题外话 最近一篇文章还是在11月30日写的&#xff0c;好长时间没有打卡了。最近工作上的事情特别多&#xff0c;主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed&#xff0c;后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…

推荐5款局域网IP扫描工具,支持电脑+Android!

在日常网络管理中&#xff0c;快速扫描局域网中的设备和IP地址是一项基本但非常重要的任务。无论是排查网络问题还是进行设备管理&#xff0c;一款好用的 IP 扫描工具都能让你事半功倍。 如何选择适合自己需求的局域网 IP 扫描工具&#xff1f;有哪些功能强大又易于上手的工具…

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…

计算机网络—————考研复试

第一章、计算机网络体系结构 1. OSI参考模型和TCP/IP模型&#xff1a; OSI与TCP/IP的记忆方法&#xff1a;只需把OSI的七层记住&#xff0c;将应用层、表示层、会话层一起记&#xff0c;到TCP/IP变成应用层。物理层和数据链路层换成网络接口层。把网络层换个字变成网际层。 而…

springboot534售楼管理系统(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

计算机体系结构期末复习3:GPU架构及控制流问题

目录 一、GPU设计思路 1.简化流水线、增加核数 2.单指令多线程&#xff08;SIMT&#xff09; 3.同时驻留大量线程 4.总思路&#xff1a;多线程单指令多线程 二、GPU的控制流问题 1.什么是控制流问题 2.怎么应对分支分歧 一、GPU设计思路 1.简化流水线、增加核数 2.单指…

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题&#xff1f;您可能知道一种方法&#xff0c;但不知道如何操作。此外&#xff0c;您要传输的视频越大&#xff0c;完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad&#xff0c;特别是当您需要发送大视频文件时&#xff1f…

httpslocalhostindex 配置的nginx,一刷新就报404了

当你的Nginx配置导致页面刷新时报404错误时&#xff0c;通常是由于以下几个原因造成的&#xff1a; 静态文件路径配置错误&#xff1a;Nginx没有正确地指向静态文件的目录。前端路由问题&#xff1a;如果是SPA&#xff08;单页应用&#xff09;&#xff0c;刷新页面时Nginx没有…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集&#xff0c;使用yolo&#xff0c;pasical voc xml, coco json格式标注&#xff0c;可识别药片和胶囊两种标签&#xff0c;2445张原始图片 数据集分割 训练组80&#xff05; 1967图片 有效集13% 317图片 测试集7% 161图片 预处…

解决winform中comboBox下拉不够长的问题

默认情况下的combobox 可以看到comboBox不够长 导致信息显示不完成 解决方法 修改属性&#xff1a;DropDownWidth为308 修改前修改后

HTML——43.创建表格

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--table标签用来定义表格&#xff0c;border属性表示边框--><!--tr标签表示表格中的一行--><!--th标签表示表…

在 Ubuntu 上安装和使用 `opus-tools` 的详细教程

目录 1. **安装 opus-tools**2. **opus-tools 常用命令** 2.1 **opusenc - 编码音频文件为 Opus 格式**示例 1&#xff1a;将 WAV 文件编码为 Opus 格式示例 2&#xff1a;设置编码比特率示例 3&#xff1a;使用变比特率&#xff08;VBR&#xff09;示例 4&#xff1a;设置声道…

[硬件] DELL BIOS 相关注意事项

前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…

ip归属地怎么判定?如何查看自己ip属地

在当今数字化时代&#xff0c;IP地址作为互联网通信的基础&#xff0c;扮演着至关重要的角色。而IP归属地的判定与查看&#xff0c;不仅关乎网络安全、隐私保护&#xff0c;还直接影响到社交平台的信任机制与信息传播的真实性。本文将深入探讨IP归属地的判定原理以及如何查看自…

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…

前端安全措施:接口签名、RSA加密、反调试、反反调试、CAPTCHA验证

文章目录 引言I 设置防爬虫功能使用robots.txt文件通过配置HTTP头部中的X-Robots-TagII 禁止打开开发者工具反复清空控制台无限debugger反调试检查是否按下了F12或其他调试快捷键禁用右键监听调试快捷键例子III 屏蔽粘贴/复制/剪切/选中IV 知识扩展: javascript内置命令调试分…

Mac M2 Pro安装MySQL 8.4.3

絮絮叨叨 MacBook Pro&#xff0c;芯片&#xff1a;Apple M2 Pro, macOS: Sonoma 14.0一直知道很多软件对Mac M1或M2的支持不好&#xff0c;但没想到在安装MySQL 8.x上也让我吃尽了苦头本文除了介绍如何安装MySQL 8.4.3外&#xff0c;还会记录笔者遇到的一些问题以及解决方法 …