C++11 range-for 中的auto,auto&, auto&&, const auto&

range-for 是对一定范围内的(如容器vector或者一段string)的循环遍历语句,从头到尾。参考Range-based for loop (since C++11) - cppreference.com<

Executes a for loop over a range.

Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container. 

>

我们需要声明一个变量,叫做range-declaration(如下文中的变量c), 并且需要为其确定一个类型,通常我们用auto这个关键字 ,进行自动类型推导。

此时就涉及到标题中auto,auto&, auto&&, const auto&的使用,其实更多的是C++中值传递,引用传递,右值引用等知识,使用以下代码进行了测试,以及测试结果。

#include <stdio.h>
#include <iostream>
#include <vector>
#include <numeric>
#include <string>
using std::vector;

int main()
{

//测试1:auto c, 创建拷贝,每次遍历都是copy一次,不会对str中的元素进行修改
	std::string str("str ing1");
	for (auto c : str)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str<<'\n';  //这时再看原str字符串,仍然输出str ing1,没变化。

//测试2:auto& c, reference, 可以通过c给str2中的元素赋值
	std::string str2("str ing1");
	for (auto& c : str2)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str2<<'\n';  //这时再看原str2字符串,输出tus!joh2,被重新赋值了。

//测试3:auto&& c,右值引用, 可以修改str3中的元素
	std::string str3("str ing1");
	for (auto&& c : str3)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str3<<'\n'; //这时再看原str3字符串,输出tus!joh2,被重新赋值了。

//测试4:const auto&, 只读str4中的元素
	std::string str4("str ing1");
	for (const auto& c : str4)
	{
		//c+=1;  //报错,assignment of read-only reference 'c',const限定c只读
		std::cout<<c;
	}
	std::cout<<'\n';
	std::cout<<str4<<'\n';
}

初学C++,记录一下,随时更新。有不对/片面的地方,请评论区及时指正。

学习时用的参考链接:

C++ 遍历循环表达示 auto, auto&, auto&&

C++ 中的auto、auto&、auto&&、const auto&_橙橙小狸猫的博客-CSDN博客_auto&&

Range-based for loop (since C++11) - cppreference.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值