像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