赞
踩
在C++11中引入了for(auto s:sp),for(auto &s:sp)这种新的特性,sp是一个序列,s是一个用于访问sp中基本元素的变量,每次迭代都会用sp中的下一个元素来初始化s。C++基于这种方式,以一种统一、简洁的方式遍历数组和容器。
Syntax
attr(optional) for ( range_declaration : range_expression ) loop_statement
attr(optional) for ( init-statement(optional)range_declaration : range_expression ) loop_statement (since C++20)
//for range-based loop大致形式是这样的:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
} //(until C++17)
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
} //(since C++17)
{
init-statement
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
} //since C++20
//auto s 和 auto& c,会被替换到range_declaration的地方.
下面来看两个例子:
//demo1
#include <iostream>
using namespace std;
int main()
{
int arr[] = {1,3,5,7};
//在这里是采用只读方式遍历数组
for(auto i : arr)
{
i += 2;
}
for(int idx = 0; idx != 4; ++idx)
{
cout << arr[idx] << endl;
}
}
// Output:
1
3
5
7
//若采用下面的方式进行遍历,arr中每个元素都会自动加2
for(auto&i : arr)
{
i += 2;
}
如果只是希望遍历,而不需要修改,可以使用const auto& 来定义i的类型,这样对于复制负担比较大的容器元素(比如:std:vector
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。