像python一样,优雅地简化对数组、容器的遍历代码。

其实很多时候还是很羡慕python中for循环的写法的,直到发现...原来C++11原来也有这么优雅的循环写法,真香!
为了在遍历容器时支持“foreach”用法,C++11扩展了for语句的语法。用这个新的写法,可以遍历C类型的数组、初始化列表以及任何重载了非成员的begin()和end()函数的类型。 如果你只是想对集合或数组的每个元素做一些操作,而不关心下标、迭代器位置或者元素个数,那么这种foreach的for循环将会非常有用。

1. 基于范围的for循环

循环最常见的的场景就是对数据集合的每一个元素进行某种操作。C++11之前,大致是这样的程序:

int a[] = {1, 2, 3, 4};

int sum = 0;

for(int i = 0 ; i < sizeof(a)/sizeof(a[0]); ++i){

        sum += a[i];

}

vector<int> v{1, 2, 3,4};

int sum = 0;

for(auto it = v.begin(); it != v.end(); it++){

    sum += *it;

}

而在C++11 引入基于范围的for循环后,循环可以优雅地写成下面这样:

int array[]{1, 2, 3, 4};

int sum = 0;

 for(int a : array){

     sum += a;

}

vector<int> vect{1, 2, 3, 4};

int sum = 0;

for(int v: vect){

    sum += v;

}

for(int v : vect)可以理解为“对于vect中的每一个v”。

2. 应用条件

正如之前所说,数据v被范围for遍历的条件是,该数据支持v.begin()/v.end()或者是begin(v)/end(v)并返回一个迭代器。STL中的容器都满足上述条件。对于内置类型的数组来讲C++编译器提供了等同于上述接口的机制,因此也可以在范围for中使用。

3. 完整示例

#include <iostream>
#include <vector>
 
int main() {
    std::vector<int> v = {0, 1, 2, 3, 4, 5};
 
    for (const int& i : v) // 以 const 引用访问
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (auto i : v) // 以值访问,i 的类型是 int
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (auto& i : v) // 以引用访问,i 的类型是 int&
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int n : {0, 1, 2, 3, 4, 5}) // 初始化器可以是花括号初始化器列表
        std::cout << n << ' ';
    std::cout << '\n';
 
    int a[] = {0, 1, 2, 3, 4, 5};
    for (int n : a) // 初始化器可以是数组
        std::cout << n << ' ';
    std::cout << '\n';
 
    for (int n : a)  
        std::cout << 1 << ' '; // 不必使用循环变量
    std::cout << '\n';
 
}

//输出为
// 0 1 2 3 4 5
// 0 1 2 3 4 5
// 0 1 2 3 4 
// 0 1 2 3 4 5
// 0 1 2 3 4 5
// 1 1 1 1 1 1