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

 更新时间:2022年04月15日 16:39:08   作者:LuxiZheng_  
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++ 11新特性之右值引用使用案例与应用场景

    C++ 11新特性之右值引用使用案例与应用场景

    右值引用和move语义是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一种新的引用类型,下面这篇文章主要给大家介绍了关于C++ 11新特性之右值引用使用案例与应用场景的相关资料,需要的朋友可以参考下
    2024-01-01
  • Qt实现进程界面之间的鼠标焦点切换

    Qt实现进程界面之间的鼠标焦点切换

    这篇文章主要为大家详细介绍了Qt实现进程界面之间的鼠标焦点切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C++使用map实现多进程拷贝文件的程序思路

    C++使用map实现多进程拷贝文件的程序思路

    这篇文章主要介绍了C++使用mmap实现多进程拷贝文件,通过本文给大家分享程序思路及完整代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C++ 多继承详情介绍

    C++ 多继承详情介绍

    这篇文章主要介绍了C++ 多继承详情,C++支持多继承,即允许一个类同时继承多个类。只有C++等少数语言支持多继承,下面我们就来看看具体的多继承介绍吧,需要的朋友可以参考一下
    2022-03-03
  • 详解C++11中的lambda匿名函数

    详解C++11中的lambda匿名函数

    匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式,这篇文章主要介绍了C++11中的lambda匿名函数,需要的朋友可以参考下
    2022-11-11
  • C++数位DP复杂度统计数字问题示例详解

    C++数位DP复杂度统计数字问题示例详解

    这篇文章主要为大家介绍了利用C++数位DP的复杂度来统计数字问题的示例实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升值加薪
    2021-11-11
  • C++与Lua交互内存分配详解

    C++与Lua交互内存分配详解

    C/C++ 与 Lua 的交互是通过 lua_State 这一句柄进行交互,我们常规的创建都是通过 luaL_newstate 这一辅助函数,这篇文章主要给大家详细介绍了C++与Lua交互内存分配,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • C++ 搬水果贪心算法实现代码

    C++ 搬水果贪心算法实现代码

    这篇文章主要介绍了C++ 搬水果贪心算法实现代码的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言结构及队列实现示例详解

    C语言结构及队列实现示例详解

    这篇文章主要为大家介绍了C语言实现队列示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C语言强制类型转换规则实例详解

    C语言强制类型转换规则实例详解

    强制类型转换是把变量从一种类型转换为另一种数据类型,下面这篇文章主要给大家介绍了关于C语言强制类型转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论