C/C++教程

范围for语句for auto详解(C++11新特性)

本文主要是介绍范围for语句for auto详解(C++11新特性),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

范围for语句for auto详解(C++11新特性)

  • auto类型说明符
  • 范围for语句for auto

auto类型说明符

常常需要将表达式的值赋给变量,为了解决声明变量时表达式的值未知的问题,引入了auto类型说明符。它可以根据初始值自动分析表达式所属类型:

// 由val1和val2相加的结果推断出item的类型
auto item = val1 + val2;
//声明同一种类型
auto i = 0, *p = &i;//正确:p是整形指针
//不能声明不同类型
auto sz = 0, pi = 3.14 //错误

范围for语句for auto

c++11引入了一种更简单的for语句,可遍历容器或序列的所有元素:

for (declaration: expression)
	statement

其中expression必须是一个序列,其拥有能返回迭代器begin和end成员;
declaration定义一个变量,序列中的每个元素都必须能转换成该变量的类型,通常使用auto。如果需要对序列中的元素执行操作,循环变量须声明成引用类型
每次迭代都会重新定义循环控制变量,并将其初始化为序列中的写一个值,之后执行statement。所有元素都处理完毕后循环中止。

vector<int> v = {0,1,2,3,4,5,6,7,8,9};
//范围变量须是引用类型,才能对元素执行写操作
for(auto &r : v) //对v中每一个元素
    r *= 2;//将v中每个元素翻倍

由于准备修改v中元素的值,因此将r声明成引用类型。此时在循环内给r赋值,即改变了r所绑定的元素的值。
范围for语句等价的传统for语句:

for (auto beg = v.begin(), end = v.end(); beg != end; ++beg) {
	auto &r = *beg;
	r *= 2;
}


1.由于范围for语句预存了容器end()的值,所以不能在范围for语句内添加(删除)序列中的元素,否则end函数的值可能会无效。
2.由于for auto是c++11新特性,所以在使用vscode时可能会报错,需要在配置文件或CMakeLists中添加c++11特性

这篇关于范围for语句for auto详解(C++11新特性)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!