【C++】基于范围的for循环 (C++11)

news2024/11/27 4:34:25

基于范围的for循环 C++11

  • 一、范围for的基本语法
  • 二、范围for中使用引用 (一些奇葩的问题)
    • 讨论
  • 三、范围for的使用条件


一、范围for的基本语法

在C++98中如果要遍历一个数组,可以按照以下方式进行:

#include<iostream>
using namespace std;
void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
		cout << array[i] << " ";
	cout << endl;
}
int main()
{
	TestFor();
	return 0;
}

在这里插入图片描述
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

看范围 for 语句的定义:

for (declaration : expression)
  statement

其中,expression部分是个序列,declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。
代码实例

#include<iostream>
using namespace std;
void TestFor2()
{
	int array[] = { 1, 2, 3, 4, 5 };
	//定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
	for (auto e : array)
		e *= 2;
	for (auto e : array)
		cout << e << " ";
}
int main()
{
	TestFor2();
	return 0;
}

在这里插入图片描述
注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

二、范围for中使用引用 (一些奇葩的问题)

看了上面的代码我们如果想利用范围for去改变数组中的值那我们应该怎么办呢?其实很好办我们只需要范围for里面的变量改成引用类型就行了。
例如:

#include<iostream>
using namespace std;
void TestFor3()
{
	int array[] = { 1, 2, 3, 4, 5 };
	//定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
	for (auto& e : array)
	{
		e *= 2;
		cout << e << " ";
	}
}
int main()
{
	TestFor3();
	return 0;
}

在这里插入图片描述

看到这里如果你细心的话就会想:“这里面引用变量 e 怎么能够改变绑定呢?”实际上,范围for中的变量 e是每次迭代,e变量会被重新创建,所以这里的引用相当于不断地被初始化。

当然同样在for()循环中还有一个例子与这里变量 e 的创建方式相同,还有一个例子与这里变量 e 的创建方式不同,
①相同

#include<iostream>
using namespace std;
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		int a = 10;
		cout << a << " ";
		a++;
	}
	return 0;
}

在这里插入图片描述

这是因为a是局部变量,每次重新循环,a都会重新创建,和上面的范围for中使用引用类似。

②不同
在for()循环的初始化列表中创建的变量不会每次重新循环时会重新创建,但是for()循环结束时,在for()循环的初始化列表中创建的变量也会消失。

#include<iostream>
using namespace std;
int main()
{
	for (int i = 0; i < 10; i++)
	{
		cout << i << " ";
	}
	return 0;
}

在这里插入图片描述

在这里插入图片描述

讨论

范围for中的变量的创建与上面正常for()循环的第一种方式相像,可能它们的实现方式一样,这个我不太了解,如果有明白的小伙伴可以评论区一起讨论一下。

三、范围for的使用条件

  • for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围; 对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
    注意:以下代码就有问题,因为函数传参不会传数组,数组名代表首元素的地址,因此for的范围无法确定。
void TestFor(int array[])
{
	for(auto& e : array)
		cout<< e <<endl;
}

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

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

相关文章

分享111个JS焦点图代码,总有一款适合您

分享111个JS焦点图代码&#xff0c;总有一款适合您 111个JS焦点图代码下载链接&#xff1a;https://pan.baidu.com/s/1GxjW5m9DNOPEQd-Qf_gGSA?pwd4aci 提取码&#xff1a;4aci Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj jQuery宽屏左右…

锦正茂EM3电磁铁的技术参数

产品特点&#xff1a; ※U形结构、视野开阔、磁场强度高、磁场强度大小调节方便 ※体积小、重量轻、占空比小、结构紧凑、磁场性能更佳 ※电磁铁的工作气隙调节轻便灵活&#xff0c;极头处设有螺纹&#xff0c;更换极头装卸方便 ※可选配工作间隙刻度指示 ※小气隙时用于铁…

代理模式(Proxy Pattern)

代理模式定义&#xff1a; 提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。举个例子&#xff1a;猪八戒去找高翠兰结果是孙悟空变的&#xff0c;可以这样理解&#xff1a;把高翠兰的外貌抽象出来&#xff0c;高翠兰和孙悟空都实现了这个接口&#xff…

跨境电商选品重要吗?

选品很重要&#xff01;跨境电子商务选择的核心要求&#xff1a;优质商品&#xff0c;价格优势&#xff0c;符合跨境销售特点&#xff0c;满足目标海外市场需求&#xff0c;突出自身特色竞争优势。跨境电商是如何选择产品的&#xff1f;这个问题也很流行&#xff0c;应该考虑以…

面试-java Spring 一

一.Spring两大特性 控制反转(IoC)&#xff1a;就是创建对象的控制权&#xff0c;被反转到了Spring框架上。通常我们实例化一个对象时&#xff0c;都是使用类的构造方法来new一个对象&#xff0c;这个过程是由我们自己来控制的&#xff0c;而控制反转就把new对象的工交给了Spri…

加拿大访问学者家属如何办理探亲签证?

由于大多数访问学者的访学期限都为一年&#xff0c;家人来访不仅可以缓解访学的寂寞生活&#xff0c;而且也是家人到加拿大体验国外风情的好机会。家属在国内申请赴加签证时&#xff0c;如果材料齐全&#xff0c;一般上午递交了申请&#xff0c;下午就可以拿到签证。以下是家人…

mongo DB数据库bindIP的配置和我的理解(bindIP不是应用服务器的IP)

先批评这个文章&#xff01;典型的错误&#xff0c;bindIP根本不是绑定哪一个ip的 背景&#xff1a;最近在阿里云上搭建overleaf的web服务集群&#xff0c;数据库和应用服务器分离&#xff0c;一口气买了三台服务器准备开始干活。overleaf用的是mongodb&#xff0c;我本来准备…

【多道批处理系统】计算完成两个作业需要的最少时间,并图文叙述

一个多道批处理系统中仅有P1和P2两个作业,P2比P1晚5ms到达, 它们的计算和I/O操作顺序如下。 P1:计算60ms,I/O操作80ms,计算20ms。 P2:计算120ms,I/O操作40ms,计算40ms。 不考虑调度和切换时间,请计算完成两个作业需要的最少时间&#xff0c;并图文叙述两个作业的执行情况。

[开源]ChatGPT-OpenAI注册使用保姆级教程?[开箱可用][免费使用]

[开源]ChatGPT-OpenAI注册使用保姆级教程?[开箱可用][免费使用]ChatGPT是什么?1.ChatGPT官网2.一部分打不开的ChatGPT官网3.如何开始真实的ChatGPT官网之旅...3.1有美国IP的服务器3.2一个chrome浏览器插件ChatGPT for Google3.3打开了...4.获取用户输入正确的手机号(美国)4.1…

mysql explain 执行计划 超简单入门介绍与sql案例以及常用sql优化方案

explain说明 EXPLAIN是MySQl必不可少的一个分析工具&#xff0c;主要用来测试sql语句的性能及对sql语句的优化&#xff0c;或者说模拟优化器执行SQL语句。 在select语句之前增加explain关键字&#xff0c;执行后MySQL就会返回执行计划的信息 而不是执行sql。但如果from中包含子…

Ubuntu安装搜狗输入法

目前搜狗输入法已支持Ubuntu1604、1804、1910、2004、20101、添加中文语言支持&#xff0c;并使用fcitx输入法框架&#xff08;搜狗输入法基于fcitx&#xff09;打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言”弹出“已安装语言…

RabbitMq相关面试题

文章目录消息队列有没有接触过&#xff1f; 简单介绍一下&#xff1f;消息中间件模式分类 &#xff1f;使用MQ有什么好处&#xff1f;MQ如何选型 &#xff1f;你们项目中用到过 MQ 吗&#xff1f;谈谈你对 MQ 的理解&#xff1f;MQ消费者消费消息的顺序一致性问题&#xff1f;R…

蓝桥杯-单片机类客观题真题解析

2017年第八届(国赛) 选项A 用于中断 选项B code :程序存储区(64KB) idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同,是用类似C中的指针方式访问的。 data:固定指前面0x00-0x7f的128个RAM,可以直接读写的,速度最快,生…

如何降低输电线路在线监控摄像头的功耗呢?

输电线路视频/图像监测装置通过安装在线路杆塔上的摄像头&#xff0c;将线路走廊、通道、杆塔、绝缘子、导线、金具等的图像&#xff0c;经无线公网&#xff08;4G/3G&#xff09;传输到监控中心平台上&#xff0c;使管理者和运维人员通过办公电脑&#xff0c;就可实时掌握现场…

内存检测工具Dr.Memory在Windows上的使用

之前在https://blog.csdn.net/fengbingchun/article/details/51626705 中介绍过Dr.Memory&#xff0c;那时在Windows上还不支持x64&#xff0c;最新的版本对x64已有了支持&#xff0c;这里再总结下。 Dr.Memory源码地址https://github.com/DynamoRIO/drmemory&#xff0c;最新发…

计算机网络概念——应用层email协议

1. email的工作方式。电子邮件中有四个重要的组成部分&#xff1a;邮件服务器&#xff08;电子邮件体系结构的核心&#xff0c;为其用户提供邮箱服务&#xff08;管理、维护用户报文的服务&#xff09;&#xff0c;并起到邮件服务器间相互通信的作用&#xff09;、用户代理&…

apisix 初体验

文章目录前言一、参考资料二、安装1.安装依赖2.安装apisix 2.53.apisix dashboard三、小试牛刀3.1 上游&#xff08;upstream&#xff09;3.2 路由&#xff08;route&#xff09;四、遇到的问题前言 APISIX 是一个微服务API网关&#xff0c;具有高性能、可扩展性等优点。它基于…

JavaEE15-Spring Boot统一功能处理

目录 1.统一用户登录权限效验 1.1.最初用户登录验证 1.2.Spring AOP用户统一登录验证的问题 1.3.Spring拦截器 1.3.1.创建自定义拦截器&#xff0c;实现 HandlerInterceptor 接口并重写 preHandle&#xff08;执行具体方法之前的预处理&#xff09;方法 1.3.2.将自定义拦…

2023养老展,CBIAIE第十届中国北京国际老年产业博览会

8月招商季&#xff0c;第十届中国&#xff08;北京&#xff09;国际老年产业博览会再次盛大举办&#xff1b; CBIAIE北京国际老年产业博览会位域优势&#xff1a; ——北京&#xff0c;中国首都&#xff0c;世界一线城市&#xff0c;地处中国北部、华北平原北部&#xff0c;东…

安装PhpStorm2020.3

1、卸载旧软件 如果已安装软件&#xff0c;先打开文件安装目录&#xff0c;找到Uninstall.exe点击卸载 删除.jetbrains目录 点击软件“PhpStorm-2020.3.exe”安装 打开软件 打开一个新建的空文件夹&#xff0c;预加载 将BetterIntelliJ.zip拖动到idea的编辑区域 然后…