C++进阶 —— 范围for(C++11新特性)

【C++】范围for 通过范围for循环,可以简化对容器、数组等数据结构的遍历操作,使代码更加简洁和易于理解。 阅读详情

目录

一,范围for介绍

二,范围for注意事项


一,范围for介绍

        范围for(range-based for loop)是C++11新引入的特性,可遍历各种序列结构的容器(如数组、vector、list等);每次循环都会将序列中的下一个元素,赋值给声明的变量,直到循环结束;

//element_declaration 声明循环变量的类型和名字
//sequence 是一个序列结构,例如数组、向量、列表等,或具有迭代器接口的对象;
for ( element_declaration : sequence ) {
    // 循环体
}

使用条件

  • 范围for迭代的范围需确定;
  • 迭代的对象要实现++和==操作;

原理是通过序列的迭代器来遍历其中的元素,编译器会自动处理迭代器的初始化、增量及结束等细节,无需手动操作;

int main()
{
	list<int> li = { 1,2,3,4 };
	for (auto i : li)
		cout << i << " ";
	return 0;
}

数组也是序列结构可通过模板函数begin/end获取相应的迭代器;

container (1)	
    template <class Container>
      auto begin (Container& cont) -> decltype (cont.begin());
    template <class Container>
      auto begin (const Container& cont) -> decltype (cont.begin());
array (2)	
    template <class T, size_t N>
      T* begin (T(&arr)[N]);
container (1)	
    template <class Container>
      auto end (Container& cont) -> decltype (cont.end());
    template <class Container>
      auto end (const Container& cont) -> decltype (cont.end());
array (2)	
    template <class T, size_t N>
      T* end (T(&arr)[N]);
int main() 
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (int* ptr = begin(arr); ptr != end(arr); ++ptr)
        std::cout << *ptr << " ";
    return 0;
}

二,范围for注意事项

  • 范围for迭代的范围是确定的,所以无需担心越界;
  • 可遍历定义了begin() 和 end() 方法的对象,如vector,set,list,map,queue,deque,string;
  • 不可使用指针(如new生成的数组)作为循环结构里的序列;
  • 由于数组在遍历的时候会转换成指针,所以在遍历多维数组的时候,除最内层循环外,其他所有循环的控制变量都要使用引用的形式。
class myclass
{
public:
    //需定义begin、end这两个成员函数,才可使用范围for
	int* begin() { return arr; }	
	int* end() { return arr + 4; }
private:
	int arr[4] = { 1,2,3,4 };
};

int main()
{
	myclass li;
	for (auto i : li)
		cout << i << " ";
	return 0;
}
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (auto i : arr)
        std::cout << i << " ";
    return 0;
}
int main()
{
    int* parr = new int[5];
    //parr无合适的begin函数,报错
    for (auto i : parr)
        std::cout << i << " ";
    return 0;
}
int main()
{
	int arr[2][3] = { {1,2,3},{4,5,6} };
	//row的类型为int*,即arr内每个元素的首元素地址
	for (auto row : arr) 
		cout << row << " ";
	//row的类型为int[3]&,即arr内每个元素的类型
	for (auto& row : arr)
		cout << row << " ";

	//其中最内层的循环col类型为int[3]&,是数组
	for (auto& row : arr)
		for (auto col : row) //col的类型为int,
			cout << col << " ";
	return 0;
}


 

c++11新特性篇-基于范围的for循环 基于范围的 for 循环(Range-based for loop)是C++11引入的新特性。这种循环形式使得遍历容器(如数组、向量、列表等)中的元素变得更加简洁和直观。在C++11之前,我们通常使用传统的 for 循环或迭代器来遍历容器中的元素。其中,container 是一个容器(如数组、向量、列表等),element 是容器中的每个元素。auto 关键字用于自动推导容器中的元素类型。这种循环会遍历容器中的每个元素,将元素赋值给 element,然后执行循环体内的操作。 阅读详情

相关推荐

c++ 基于范围的for循环详解

(Range-based for loop),用于遍历容器和数组。如果确认不会修改引用对象,请在前面加上const限定符。帮助编译器生成更加高效的代码。在for循环中基于复杂对象我们使用引用,这样可以避免对象拷贝,提升性能。下面的示例展示了如何使用基于范围的for循环遍历之前定义的。C++11引入了一种更简洁、统一的循环结构——如果是基础类型,直接使用值即可。程序执行结果为:C++11!程序执行结果为:C++11。

usstmiracle的博客 2919

C++范围for详解

范围for是遍历方式中的一种,以前在遍历的时候,经常会用到范围for,但对它的使用原理并不是很清楚,下面将对其做详细的介绍。 以一段代码为例: int main() { string strs[] = { "苹果", "香蕉", "草莓", "橘子" }; for (const auto& e : strs) { cout << e << " "; ...

yam_sunshine的博客 3025

C++(20):自定义类型实现基于范围的for循环

C++自定义类型,可以通过实现begin和end作为成员函数,来支持基于范围的for循环。

风静如云的博客 634

【C++语法糖】范围for

C++11标准后引入了范围for,这个范围for是一种语法糖,来简化代码书写。下面是简单遍历数组的一段简单代码但是如果将数组换成不连续存储的链表list,就不能使用上面的方式,得用迭代器。我们可以看到这段代码还是相对比较麻烦的,C++11以后引入了范围for的语法糖就大大简化了上面的代码。

Alenenen的博客 2429

Spark数据倾斜问题+解决方案

1、数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于 其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈 数据倾斜俩大直接致命后果 1)数据倾斜直接会导致一种情况:Out Of Memory 2)运行速度慢 主要是发生在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(下图中的80亿条)所在的Task数 据量太大了。远远超过其他Task所处理的数据量 一个经验结论是:一般情况下,OOM的原因都是数据倾斜 2、如

诸葛搏毅 6768

onnxruntime-gpu版本选择与CUDA环境配置实战指南

本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。

weixin_29164091的博客 522

C++基础:for循环的深入理解与应用

C++中的for循环是一种强大且灵活的迭代结构,适用于需要重复执行某段代码直到满足特定条件的场景。通过掌握其语法细节和执行流程,并结合实际应用示例进行练习,程序员可以有效地利用for循环来解决各种编程问题。展望未来,随着C++标准的不断发展,for循环的用法和特性也将不断完善和丰富。程序员应持续关注C++标准的新特性,不断提升自己的编程技能和水平。

weixin_61470732的博客 1096

华为云Stack交付实战:从工勘到上线的全流程拆解

本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。

weixin_29243063的博客 156

C++11新特性之基本范围的For循环(range-based-for)

Range-Based-For 熟悉C++98/03的对于for循环就再了解不过了,如果我们要遍历一个数组,那么在C++98/03中的实现方式: int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout 而遍历容器类的For如下: std::vector vec {1,2,3,4

hailong0715的专栏 6万+

C# Code-Behind 技术全面解析

Code-Behind 是 ASP.NET Web Forms 中的一种技术模式,通过将用户界面标记(.aspx文件)与程序逻辑代码(.aspx.cs文件)分离,实现表现层与逻辑层的解耦。其核心思想是前端展示与后台逻辑的物理文件分离,通过ASP.NET编译器将两者合并编译成一个Page类并执行。Code-Behind 的优势包括较好的代码组织、较高的开发效率,尤其适合快速开发数据驱动应用。然而,与现代开发模式如ASP.NET MVC、ASP.NET Core和Blazor相比,Code-Behind 在可维

记录学习的过程 956

华为od 面试八股文_C语言_01_含答案

华为od 面试八股文_C语言_01_含答案

MISAYAONE的博客 3225

C++:C++11新特性详解(1)

前言:虽然目前没有编译器能够完全实现C++11,但这并不意味着我们不需要了解,学习它。深入学习C++11,你会发现这根本就是一门新的语言,它解决了c++98中许多遗留下来的问题。早晚会有一天,C++11便会普及大部分编译器。因此,提早做些准备也是应该的。在此我想做一个关于C++11的专题,将C++11的新特性进行一一讲解,以通俗易懂的语言及例子帮助读者入门C++11。本文便是C++11新特性超详细版

linwh8的博客 4万+

从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景

本文围绕SAP PI AEX配置中ABAP后端系统与AEX的连接问题,梳理了关键概念和技术脉络。重点指出基于ABAP 6.20及更高版本的业务系统内置了本地集成引擎(Local Integration Engine),负责与AEX的消息交互。配置要点包括:1)在SM59中创建HTTP类型RFC目标连接AEX;2)配置SAP_PROXY_ESR供设计时代理生成;3)通过SXMB_ADM设置业务系统角色为应用系统;4)确保SLD注册和SICF服务激活。文章特别强调运行时代理消息传递与设计时代理生成的区分,以及H

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 97

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

上述的几种遍历方式的共同点就是都需要写明循环的一个范围。对于我们需要完整的遍历一个有范围的集合/数组时,完全可以让编译器自动计算出范围。在使用范围遍历的方式遍历stl的容器时,如果你使用auto声明迭代器的变量,那么推导出来的类型是迭代器解引用后的对象。但范围遍历不能适用于所有情况,范围遍历的条件就是循环迭代的范围必须是可确定的。在C++98标准中,当我们遍历数组时,一般方法就是下标遍历和指针遍历。等都是可以正常使用的。遍历没有明确范围的数组,是不能使用范围遍历方法的。现在我们使用范围遍历对数组进行遍历。

林夕07 4406

GeoXCP:可解释人工智能中空间解释的不确定性量化

GeoXCP: uncertainty quantification of spatial explanations in explainable AI提出基于保形预测(conformal prediction)的不确定性量化框架——地理空间解释保形预测(GeoXCP),将空间依赖纳入建模过程,生成具有校准不确定性估计的空间自适应解释。通过大量模拟实验和真实世界数据集验证,GeoXCP在不同地理空间场景中能提供可靠解释并有效量化不确定性,推动可解释地理空间机器学习的发展,帮助决策者评估模型驱动洞察的可信度。

May the Force be with you 243

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6474

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

C++11中的新特性—基于范围的for循环 C++ 11提供了一个特殊版本的 for 循环,在很多情况下,它都可以简化数组的处理,这就是基于范围的 for 循环。在使用基于范围的 for 循环处理数组时,该循环可以自动为数组中的每个元素迭代一次。 例如,如果对一个 10 元素的数组使用基于范围的 for 循环,则该循环将迭代 10 次。因为基于范围的 for 循环可以自动知道数组中元素的个数,所...

weixin_43831728的博客 1293

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

一点一点变好 2760

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ 新特性详解:基于范围的for循环

在C++11之前,遍历容器总是需要写冗长的迭代器代码,既容易出错又不够优雅。基于范围的for循环的出现彻底改变了这一现状,让C++代码变得更加简洁、安全、易读

筏的博客 1158

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【 C++11 】列表初始化、声明、范围for、STL中一些变化

目录 1、C++11简介 2、统一的列表初始化 { }初始化 initializer_list容器 3、声明 auto decltype nullptr 4、范围for 5、STL中一些变化

bit_zyx的博客 1057

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

auto。

普罗米修斯的博客 2418

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

1.1 for循环的新用法 一般情况下在C++下遍历一个容器的方法是这样的 std::vector array = {1, 2, 3, 4, 5}; for(auto it=array.begin(), it !=array.end(); ++it) { std::cout << *it << "\t"; }对于刷洗STL的用户的话知道在中有一个函数叫for_each算法来完成上诉的功能。

m_buddy的博客 2604

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

介绍了范围for的基本使用,后续还会讲解

dab112的博客 1135

【C++进阶】C++11入门基础

【C++进阶】C++11入门基础

小小unicorn的博客 1274

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

1. C++98/03 for循环与 C++ 11 for循环 1.1 两种for循环语法 在 C++03/98 中,不同的容器和数组,遍历的方法不尽相同,写法不统一,也不够简洁,而 C++11 基于范围的 for 循环以统一、简洁的方式来遍历容器和数组,用起来更方便了。 C++98/03 中普通的 for 循环,语法格式: for(表达式 1; 表达式 2; 表达式 3) { // 循环体 } C++11 基于范围的 for 循环,语法格式: for (declaration : express

M2嵌入式 752
上一篇: C++进阶 —— 列表初始化(C++11新特性)
下一篇: C++进阶 —— lambda表达式(C++11新特性)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值