当前位置:   article > 正文

C++11基于范围的for循环for range-based loop_c++基于范围循环 range-based for loop

c++基于范围循环 range-based for loop

在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)
  • 1
  • 2
  • 3
//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的地方.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

下面来看两个例子:

//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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
//若采用下面的方式进行遍历,arr中每个元素都会自动加2
for(auto&i : arr)   
  {
      i += 2;
  }
  • 1
  • 2
  • 3
  • 4
  • 5

如果只是希望遍历,而不需要修改,可以使用const auto& 来定义i的类型,这样对于复制负担比较大的容器元素(比如:std:vector

Reference:Range-based for loop (since C++11)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/795540
推荐阅读
相关标签
  

闽ICP备14008679号