C++新特性详细分析基于范围的for循环

目录
  • 1、概念
    • 1.1、普通的for循环
    • 1.2、基于范围的for循环
    • 1.3、两者的区别
  • 2、基于范围的for循环使用
    • 2.1、值拷贝
    • 2.2、引用
    • 2.3、只读引用
    • 2.4、关联容器

1、概念

// 普通的for循环
for(表达式 1; 表达式 2; 表达式 3)
{
    // 循环体
}

// 基于范围的for循环
for (declaration : expression)
{
    // 循环体
}

1.1、普通的for循环

它的工作流程是:

1、执行表达式 1

2、如果表达式 2 为 true,则执行循环体,否则跳出循环

3、执行表达式3,会到第二步,重复执行。

这种方式需要给出容器的两端,即开头和结尾。

1.2、基于范围的for循环

它的工作流程:

1、将 expression 中的元素拷贝到 declaration

2、重复执行

这种方式不需要给出容器的两端,循环会自动以容器为范围展开,并且循环中也屏蔽掉了迭代器的遍历细节,直接抽取容器中的元素进行运算。

expression 可以是容器、数组、表达式、初始化列表等

1.3、两者的区别

例子:

vector<int> arr{ 1,2,3,4,5,6 };
// 普通的 for 循环
for (auto it = arr.begin(); it != arr.end(); ++it)
	cout << *it << endl;

// 基于范围的 for 循环
for (auto val : arr)
	cout << val << endl;

1、基于范围的 for 循环书写更为简单

2、上述例子中,基于范围的for循环的容器 arr 只访问了一次,即 : 后边的表达式只执行一次;而普通for循环每次都要比较迭代器是否到了容器的边界

2、基于范围的for循环使用

2.1、值拷贝

// 只是将容器中的元素拷贝到 val,修改val不会影响容器中的值
for (auto val : arr)
	cout << val << endl;

2.2、引用

// 使用引用,修改val会影响容器中的值,即可以直接修改容器的值,且避免了拷贝的开销
for (auto& val : arr)
	cout << val << endl;

2.3、只读引用

// 使用const 修饰引用,使得只能只读,不能修改容器的数据
for (const auto& val : arr)
	cout << val << endl;

2.4、关联容器

遍历关联容器(set、map、multiset、multimap)时,即使使用引用,也不能修改容器中的值。对于关联容器来说,内部元素都是只读的,这是由容器的特性决定的,因此在 for 循环中 auto & 会被视为 const auto &

// 使用const 修饰引用,使得只能只读,不能修改容器的数据
set<int> st{ 1,2,3,4,5,6 };
for (auto &val : st)
    cout << val ++ << endl;		// 不能修改常量

到此这篇关于C++新特性详细分析基于范围的for循环的文章就介绍到这了,更多相关C++ for循环内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c++ For循环执行顺序流程图解

    for 循环允许您编写一个执行特定次数的循环的重复控制结构. 语法 C++ 中 for 循环的语法: for ( init; condition; increment ) { statement(s); } 下面是 for 循环的控制流: init 会首先被执行,且只会执行一次.这一步允许您声明并初始化任何循环控制变量.您也可以不在这里写任何语句,只要有一个分号出现即可. 接下来,会判断 condition.如果为真,则执行循环主体.如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循

  • 解析C++中的for循环以及基于范围的for语句使用

    for循环语句 重复执行语句,直到条件变为 false. 语法 for ( init-expression ; cond-expression ; loop-expression ) statement; 备注 使用 for 语句可构建必须执行指定次数的循环. for 语句包括三个可选部分,如下表所示. for 循环元素 下面的示例将显示使用 for 语句的不同方法. #include <iostream> using namespace std; int main() { // The co

  • C++11的for循环,以及范围Range类的简单实现

    C++11支持range-based for循环.这是一个很方便的特性,能省挺多代码.以下代码就能很方便的遍历vector中的元素,并打印出来: std::vector<int> int_vec; int_vec.push_back(1); int_vec.push_back(2); //如果要修改int_vec中的元素,将变量x声明为 int& 即可 for (int x: int_vec) { std::cout << x << endl; } 可以遍历的对

  • C++中for循环与while循环的区别总结

    C++中for循环和while循环的区别 这两者之间最大的区别就是for循环一般应用于循环次数已知的情况,而while循环一般应用于循环次数未知的情况.在一般情况下,这两者是可以相互转化的. 举一个简单的例子:求1-100的和. #include<bits/stdc++.h> using namespace std; int main(){ int sum=0; for(int i=1;i<=100;i++){ sum+=i; } cout<<sum; } 这个就是一个应用f

  • C++11的for循环的新用法(推荐)

    字符串 string str = "this is a string"; for(auto ch : str) cout << ch << endl; 等价于 for(int i = 0; i < str.size(); i++) cout << str[i] << endl; vector vector<int> v = {1, 2, 3, 4, 5}; for(auto i : v) cout << i

  • C++中的while循环和for循环语句学习教程

    C++ while循环 while语句的一般形式如下: while (表达式) 语句 其作用是: 当指定的条件为真(表达式为非0)时,执行while语句中的内嵌语句.其流程图见下图. 其特点是:先判断表达式,后执行语句.while循环称为当型循环. 例:求1+2+3+-+100. #include <iostream> using namespace std; int main( ) { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; }

  • c++中for双循环的那些事

    情况1:如下,这样我们会发现,n输出为100,虽然两层循环的标识符都是i,然是两个做管辖的范围不同,具体情况不明~~~求大神解释 复制代码 代码如下: int main(int argc,char* argv[]){    int n=0;    int mx;    for (int i=0;i<10;i++)    {        for (int i=0;i<10;i++)        {            n++;        }    }    cout<<n&

  • C++新特性详细分析基于范围的for循环

    目录 1.概念 1.1.普通的for循环 1.2.基于范围的for循环 1.3.两者的区别 2.基于范围的for循环使用 2.1.值拷贝 2.2.引用 2.3.只读引用 2.4.关联容器 1.概念 // 普通的for循环 for(表达式 1; 表达式 2; 表达式 3) { // 循环体 } // 基于范围的for循环 for (declaration : expression) { // 循环体 } 1.1.普通的for循环 它的工作流程是: 1.执行表达式 1 2.如果表达式 2 为 tru

  • Python3.10的一些新特性原理分析

    Python 3.10.0a2 版本已经于 2020-11-04 发布,因此我们可以窥见 Python 3.10 的一些新特性.这些新特性很可能会改变未来的 Python 生态系统,使其朝着更明确,更易读的方向发展,同时保持我们熟知和喜欢的易用性. PEP 602 1.类型注释的进一步扩展 3.9 版对 Python 中的类型提示和注释进行了大幅度修改和清理,类型提示这似乎是一种持续的趋势,在 3.10 中得到进一步扩展,目的很明显,是为了更好的可读性,无需看代码即可得知变量和函数返回值的类型.

  • Java RabbitMQ高级特性详细分析

    目录 消息的可靠投递 确认模式 退回模式 Consumer Ack 消费端限流 TTL(Time To Live) 设置某个队列为过期队列 设置单独某个消息过期 死信队列 延迟队列 消息的可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 return 退回模式 rabbitmq整个消息投递的路径为: producer—>rabbitmq broker—>

  • Swift 4最全的新特性详细解析(推荐)

    引言 Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift吸收了众多现代编程语言的优点,尽力的提供简洁的编程语言和强大的功能. WWDC 2017 给大家带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特性非常值得我们期待在正式项目中去使用它.因为 Swift 4 是开源的,如果你关注 swift-evolution 这个项目的

  • PHP7 新特性详细介绍

    PHP 的学习新特性 最近做的项目使用了 php7,但感觉有很多新特性没有用起来.就想总结一下,一些可能会用到的新特性.之前使用的环境是 php5.4,所有也会有 php5.5 和 php5.6 的特性总结进来,这里只列出我觉得在项目中可能用到的特性,主要内容来自 php手册的附录. Generators (PHP 5 >= 5.5.0, PHP 7) 通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator

  • C# 7.0 新特性1之基于Tuple的“多”返回值方法

    原文链接:http://www.cnblogs.com/ylvict/p/5573094.html 回顾  首先,提出一个问题,C#中,如何使一个方法可返回"多个"返回值?  我们先来回顾一下C#6.0 及更早版本的做法.   在C#中,通常我们有以下4种方式使一个方法返回多条数据. •使用 KeyValue 组合 • static void Main(string[] args) { int int1 = 15; int int2 = 25; var result = Add_Mul

  • ES6新特性二:Iterator(遍历器)和for-of循环详解

    本文实例讲述了ES6新特性之Iterator(遍历器)和for-of循环.分享给大家供大家参考,具体如下: 1. 遍历数组 for-of工作原理:迭代器有一个next方法,for循环会不断调用这个iterator.next方法来获取下一个值,直到返回值中的 done属性为true的时候结束循环. ① 在ES6之前 var arr = [1,2,3,4,5,6]; arr.name = 'a'; for (var index = 0; index < arr.length; index++) {

  • 详细分析JAVA8新特性 Base64

    BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且很容易破解,他核心作用应该是传输数据的正确性,有些网关或系统只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据. JDK里面实现Base64的API 在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面

  • C++通信新特性协程详细介绍

    目录 一.关于协程 二.协程的好处 三.协程得用法 四.与线程的区别 五.协程示例 一.关于协程 从 1.54.0 版本开始,Boost.Asio 支持协程.虽然您可以直接使用 Boost.Coroutine,但 Boost.Asio 中对协程的显式支持使得使用它们变得更加容易. 协程让您创建一个反映实际程序逻辑的结构.异步操作不会拆分函数,因为没有处理程序来定义异步操作完成时应该发生什么.程序可以使用顺序结构,而不是让处理程序相互调用. 二.协程的好处 考虑多任务协作的场景. 如果是线程的并发

  • Vue高级特性概念原理详细分析

    目录 1. 自定义v-model 2. $nextTick 3. slot 插槽 4. Vue 动态组件 5. Vue 异步组件 6. 使用 keep-alive 缓存组件 7. mixin 混入 1. 自定义v-model Vue中的自定义v-model指的是在自定义组件中使用v-model语法糖来实现双向绑定.在Vue中,通过v-model指令可以将表单元素的值与组件实例的数据进行双向绑定.但是对于自定义组件,如果要实现v-model的双向绑定,就需要自定义v-model的实现方式. 自定义

随机推荐