C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了。这次C++11不负众望,再也不用羡慕别家人的for range了。下面看下C++11的for循环的新用法
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循环内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C++新特性详细分析基于范围的for循环


基础教程推荐
- 一文带你了解C++中的字符替换方法 2023-07-20
- C++中的atoi 函数简介 2023-01-05
- 详解c# Emit技术 2023-03-25
- C语言 structural body结构体详解用法 2022-12-06
- C/C++编程中const的使用详解 2023-03-26
- C利用语言实现数据结构之队列 2022-11-22
- 如何C++使用模板特化功能 2023-03-05
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C++详细实现完整图书管理功能 2023-04-04
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26