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

Proteus仿真实战:基于IIC驱动SSD1306的0.96英寸OLED显示方案解析

本文详细解析了在Proteus仿真环境中基于IIC驱动SSD1306的0.96英寸OLED显示方案。从硬件搭建、IIC接口连接、软件驱动移植到常见问题排查,提供了全面的实战指导,帮助开发者快速实现OLED显示功能并优化性能。

weixin_28724661的博客 770

遥感数据处理必看:哨兵1 SLC与GRD预处理差异全解析

本文详细解析了哨兵1号卫星SLC与GRD数据的预处理差异,从数据基础认知到实战应用全流程对比。重点介绍了SLC数据的轨道校正、辐射校正等关键步骤,以及GRD数据的简化处理流程,帮助用户根据应用场景选择合适数据类型。通过SNAP等工具的实际操作示例,提升遥感数据处理效率。

weixin_29035405的博客 339

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

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

weixin_61470732的博客 1096

从仿真到器件:铌酸锂电光调制器Comsol建模避坑指南

本文详细介绍了铌酸锂电光调制器在Comsol中的建模全流程,涵盖晶体切向选择、材料参数配置、多物理场耦合等关键技术。通过实战案例和调试技巧,帮助工程师避开常见建模陷阱,提升仿真精度与效率,特别适用于高速光通信系统的器件设计与优化。

m2n3b4v5c6的博客 419

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万+

KEPServerEX与三菱iQ-R系列PLC通讯

KEPServerEX与三菱iQ-R系列PLC通讯Mitsubishi Ethernet北京东方鼎晨科技有限公司目 录1. 前言2. 三菱PLC端相关设置3. Kepware端相关设置KEPServerEX是美国PTC Kepware公司生产的具有行业性的连接平台,KEPServerEX支持150多种通讯协议,用于向您的所有应用程序提供单一来源的工业自动化数据。该平台的设计使用户能够通过一个直观的用户界面来连接、管理、监视和控制不同的自动化设备和软件应用程序。KEPServerEX利用OPC(自动化产业的互

qq_28768521的博客 8096

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 278

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

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

linwh8的博客 4万+

【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫

军事上的演练,是除了实战以外最能检验军队战斗力的一种考核方式,他可以模拟面对外部势力的攻击时候,如何更好的去维护国家和主权的安全。同样的,在网络上面,真实环境下的网络攻防演练也是检验一个单位,企业网络防御能力,发现潜在危险最好的方法。1.政策要求2安全威胁驱动当前,我国关键信息基础设施面临的网络安全形势严峻复杂,网站平台大规模数据泄露事件频发,生产业务系统安全隐患突出,甚至有的系统长期被控面对高级持续性的网络攻击,防护能力十分欠缺。目前,我国面临的网络安全威胁主要有以下几点。

wxh的博客 1574

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

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

林夕07 4406

8年ES运维经验整理出的Elasticsearch运维手册(超实用)

k1 : 控制非线性词频率归一化(饱和),Elasticsearch中默认值为1.2。用人能看懂的话说就是词语在文档中出现的次数对于得分的重要性。例如说我觉得在某些场景,一个搜索词在文档中出现越多则越接近我希望搜索的内容,就可以将这个参数调大一点。b :控制文档长度对于分数的惩罚力度。变量b处于分母上,它乘以刚刚讨论过的字段长度的比值,Elasticsearch中的b 默认值为0.75。如果b较大,则文档长度相对于平均长度的影响更大。

yonggeit的博客 5274

在 RAP 中把业务对象“搬到网口上”:service definition 与 service binding 的全流程、范式与实战

本文解析了SAP ABAP开发中service definition和service binding的关键作用。service definition负责选择要暴露的CDS实体和行为,形成服务模型;而service binding则将服务绑定到具体协议(如OData),生成可访问的端点。两者分离带来三大优势:支持同一模型多重发布、降低环境迁移耦合度、强化安全治理。文章通过预订业务对象的端到端示例,展示了如何从CDS建模到生成Fiori Elements预览。最后以售后工单业务为例,说明这种架构如何支持内外服务

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

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

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

weixin_43831728的博客 1293

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

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

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

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

一点一点变好 2760

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

筏的博客 1158

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【 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的博客 1273

【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、付费专栏及课程。

余额充值