跳到主要内容

C++11 for循环新用法

C++11基于范围的for循环

关于for循环我们已经很熟悉了,假设要遍历一个数组

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < 10; i++) {
std::cout << arr[i];
}

当需要遍历一个容器类时

std::vector<int> v {1,2,3,4,5,6,7,8,9,10};
for (std::vector<int>::iterator i = v.begin(); i != v.end(); i++) {
std::cout << *i;
}

我们需要给for循环指定开始值以及结束条件,C++11中引入了一种新的方式,可以不需要明确给出开始和结束条件的新语法

  • 基于范围的for循环

可以将上面的两个循环改写成这样

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (auto i : arr) {
std::cout << i;
}

std::vector<int> v {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (auto i : v) {
std::cout << i;
}

改写后代码简洁了很多,可读性有了一定的提高

但是这样操作的遍历是只读的,也就是说不可以修改数组或是容器中的值,如果需要对值进行修改,需要将遍历时的变量声明为引用类型

std::vector<int> v {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (auto i : v) {
std::cout << i++;
}

std::for_each方法

改写上面的两个循环结构,同样可以用STL标准库中提供的for_each方法实现

需要包含头文件 #include<algorithm>

void func(int n) {
std::cout << n ;
}
std::vector<int> v {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::for_each(v.begin(), v.end(), func});