欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

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

时间:2022-07-23 09:59:47|栏目:C代码|点击:

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++对象排序的比较你了解吗

栏    目:C代码

下一篇:Qt数据库应用之实现通用数据库分页

本文标题:C++新特性详细分析基于范围的for循环

本文地址:http://www.codeinn.net/misctech/208614.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有