【C++】 C++入门— 基于范围的 for 循环

news2024/10/7 15:20:22

C++

  • 基于范围的for循环
    • 1 使用样例
    • 2 使用条件
    • 3 完善措施
  • Thanks♪(・ω・)ノ谢谢阅读!
  • 下一篇文章见!!!

基于范围的for循环

1 使用样例

使用for循环遍历数组,我们通常这么写:

#include<iostream>

using namespace std;

int main() {
	
	int arr[] = {0, 1, 2, 3, 4, 5 };
	for(int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++){
		cout << arr[i] << " ";
	}
	return 0;
}

在这里插入图片描述
上面的代码我们给出了for循环的范围,让他遍历整个数组,但是对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。
因此C++11中引入了基于范围的for循环。

for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

#include<iostream>

using namespace std;

int main() {

	int array[] = {0, 1, 2, 3, 4, 5 };

	for (auto e : array)
		cout << e << " ";
	return 0;
	
}

使用auto 避免考虑数据类型。

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

2 使用条件

  1. for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供
    begin和end的方法,begin和end就是for循环迭代的范围。
    注意:以下代码就有问题,因为for的范围不确定
    void TestFor(int array[])
    {
    	//因为传入的参数是 数组首地址 无法判断 结束位置。
    	for(auto& e : array)
    	cout<< e <<endl;
    }	
    
  2. 迭代的对象要实现++和==的操作。(关于迭代器这个问题,我还没办法讲清楚,大家见谅)

3 完善措施

为了正确使用基于范围的for循环,需要一种方式来传递数组的大小信息到你的函数中。

有几种方法可以解决这个问题:

  1. 使用标准库容器

最推荐的方法是使用标准库中的容器,如 std::vector,因为这些类型携带大小信息并提供begin()和end()成员函数,正好适配基于范围的for循环

#include <iostream>
#include <vector>

void TestFor(const std::vector<int>& arr) {
    for(auto& e : arr) {
        std::cout << e << std::endl;
    }
}

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    TestFor(v);
}
  1. 使用模板确定数组大小

如果你必须使用数组,可以使用模板函数确定数组的大小:

#include <iostream>

template<size_t N>
//给定数组大小
void TestFor(int (&array)[N]) {
    for(auto& e : array) {
        std::cout << e << std::endl;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    TestFor(arr);
}
  1. 明确传递数组大小

如果你不能改变函数签名(比如在一些老旧代码中),可以考虑直接传递数组的大小作为另一个参数:

#include <iostream>

void TestFor(int* array, size_t size) {
    for(size_t i = 0; i < size; ++i) {
        std::cout << array[i] << std::endl;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    TestFor(arr, sizeof(arr)/sizeof(arr[0]));
}

这种方法虽然不利用了基于范围的for循环,但能处理数组丢失大小信息的问题。

std::vector或其他容器的使用是最推荐的方法,因为它们提供了更多的灵活性、安全性和功能。如果你的场景或现有代码限制了容器的使用,试试模板或明确传递数组大小的方案。

Thanks♪(・ω・)ノ谢谢阅读!

下一篇文章见!!!

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

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

相关文章

博云科技与中科可控全面合作,探索前沿金融科技新机遇

2024年1月26日&#xff0c;博云科技与中科可控在昆山高新区成功举办合作签约仪式。昆山市委常委、昆山高新区党工委书记孙道寻、中科可控董事长聂华、博云科技董事长花磊等领导出席了本次签约仪式。 中科可控将利用其在先进计算和智造领域的优势&#xff0c;为博云科技提供有关…

el-table添加(取消,确认)

点击添加输入添加项&#xff0c;但是不想添加了&#xff0c;就点击取消&#xff0c;但是在打开之前输入的数据还在&#xff0c;在点击取消的时候数据清空 页面 数据没有清空的时候&#xff0c;点击取消之后&#xff0c;在打开数据还在 数据清空之后&#xff0c;在打开数据是没…

寒假作业2月2号

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08;C &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关…

为期 90 天的免费数据科学认证(KNIME)

从 2 月 1 日开始&#xff0c;KNIME 官方将免费提供 KNIME 认证 90 天。 无论您是刚刚迈入数据科学领域、已经掌握了一些技术&#xff0c;还是正在构建预测模型&#xff0c;都可以参加为期 90 天的 KNIME 认证挑战赛&#xff0c;完成尽可能多的认证并获得数据科学技能免费认证。…

嵌入式系统学习(一)

嵌入式现状&#xff08;UP经历&#xff09;&#xff1a; 大厂的招聘要求&#xff1a; 技术栈总结&#xff1a; 产品拆解网站&#xff1a; 52audio 方案查询网站iotku,我爱方案网&#xff0c; 主要元器件类型&#xff1a;

二分查找------蓝桥杯

题目描述&#xff1a; 请实现无重复数字的升序数组的二分查找 给定一个元素升序的、无重复数字的整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的target&#xff0c;如果目标值存在返回下标 (下标从0 开始)&#xff0c;否则返回-1 数据范围: 0 < l…

哇塞,这几种Java文件读写性能差距居然这么大?

引言 这是一篇性能比较的文章&#xff0c;不分析实现原理。主要是对比Java几种常见的文件写入方式 测试代码 主要分析Stream、StreamBuffer和mmap三种方式&#xff0c;对应的大致代码如下 public static void testBasicFileIO(List<Persona> list, String path) throw…

Flume搭建

压缩包版本&#xff1a;apache-flume-1.9.0-bin.tar 百度盘链接&#xff1a;https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码&#xff1a;ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…

Chatglm3+langchain智能对话,本地文本库构建问答,图片文本库构建与问答搜索

Chatglm3langchain 主要功能&#xff1a; 调用语言模型将不同数据源接入到语言模型的交互中允许语言模型与运行环境交互 Langchain应用场景 **1. 文档问答&#xff1a;**常见的Langchain用例。在特定文档上回答问题&#xff0c;仅利用这些文档中的信息来构建问答答案&#…

KNIME 节点之战(Game of Nodes)锦标赛

“Hark! I summon thee to a contest of nodes. Art thou endowed with the courage for the encounter?” “听着&#xff01;我在此邀请你加入一场节点之战。你有勇气面对吗&#xff1f;” 官方链接 活动概要与参赛守则 诚邀您加入 KNIME 节点之战 —— 首届全球工作流挑战大…

无心剑小诗《致敬任正非》

致敬任正非 您是时代的勇者 科技海洋中砥砺前行 目光如炬&#xff0c;坚定而深邃 照亮了华为的路 引领着创新的方向 您是一颗璀璨的星 商业星空中熠熠生辉 您智慧如奔涌之泉 激荡无穷的力量 驱动着华为的发展 创造了无数奇迹 您是一位无畏的勇士 面对困难挑战&#xff0c;永…

MySQL的ACID、死锁、MVCC问题

1 ACID ACID代表原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性&#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;。一个确保数据安全的事务处理系统&#xff0c;必须满足这些密切相关的标准。 原…

02 - python入门篇

1. python入门 1.1 认识标识符 标识符是由字母、数字和下划线组成标识符的首字符必须是字母或下划线标识符区分大小写 1.2 认识保留字 简单来说就是python把一些字符串在系统中用过了&#xff0c;你后面定义就不能使用人家已经使用过的了。 保留字有哪些 import keyword …

记录一次k8s集群镜像恢复到harbor的过程

之前由于harbor的存储空间不够了&#xff0c;同事干掉了好多镜像&#xff0c;结果把现网生产的镜像也搞掉了。进行了找回操作&#xff0c;这里做下记录。 环境是k8s集群&#xff0c;容器引擎用的containerd。 最初发现这个问题是在增加节点的时候&#xff0c;发现有的节点主机…

蓝桥杯备战——11.NE555测频

1.分析原理图 我们可以看到&#xff0c;上图就是一个NE555构建的方波发生电路&#xff0c;输出方波频率1.44/2(R8Rb3)C,如果有不懂NE555内部结构&#xff0c;工作原理的&#xff0c;可以到B站学习。实在不懂仿真也行&#xff0c;比如我下面就是仿真结果&#xff1a; 然后就是下…

洛谷 P1803 凌乱的yyy / 线段覆盖

本聪明帅气文武双全的史上无敌代码猿来发题解了. 题目背景 快 noip 了&#xff0c;yyy 很紧张&#xff01; 题目描述 现在各大 oj 上有 n 个比赛&#xff0c;每个比赛的开始、结束的时间点是知道的。 yyy 认为&#xff0c;参加越多的比赛&#xff0c;noip 就能考的越好&…

企业架构TOGAF?

企业架构 企业架构&#xff08;Enterprise architecture&#xff09;是指整个公司或企业中软件和其他技术的整体视图和方法。 通常&#xff0c;企业架构不仅仅是组织各种内部基础设施的结构。相反&#xff0c;我们的目标是通过以正确的方式分析、设计、规划和实施正确的技术&…

数据结构—动态查找

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

Java基础 反射详解

目录 简介 反射的基本使用 获取 Class 对象的四种方式 基本使用示例 常用方法 生产中的常用方式 获取注解 SpringIoc容器的制作 反射 抽象工厂模式 双亲委派 反射缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍…