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&&