一、定义:
C++11 引入了基于范围的 for
循环(Range-based for loop),它是一种方便遍历容器或其他可迭代对象的语法糖。
基于范围的 for
循环的语法如下:
for (declaration : range)
{
// 循环体
}
其中,declaration
是一个变量声明,用于存储每次迭代中的元素值,可以是自定义的变量名,也可以是已有的变量名。range
是要遍历的容器或可迭代对象,例如数组、std::vector
、std::list
等。
在每次循环迭代中,变量 declaration
会被自动赋值为当前迭代的元素值,然后执行循环体中的代码。循环会依次遍历 range
中的所有元素,直到遍历完为止。
二、使用:
示例1: 遍历 std::vector
容器
#include <iostream>
#include <vector>
int main()
{
std::vector<int> numbers = {1, 2, 3, 4, 5};
//使用基于范围的for循环遍历容器
for (int num : numbers) //可以使用auto自动类型推导
{
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
//result
1 2 3 4 5
当编译器遇到基于范围的 for
循环时,它会自动将其转换为一个传统的迭代循环,以便遍历指定范围内的元素。
基于范围的 for
循环可以用于各种可迭代对象,包括数组、容器类(如 std::vector
、std::list
、std::deque
等)、字符串和自定义的可迭代类型。
循环过程中,每次迭代都会从指定范围中获取下一个元素,并将其赋值给循环变量。这使得在循环体内部可以直接使用循环变量来操作当前元素,而无需显式访问迭代器或索引。
示例2: 如果想修改容器中的元素需要使用引用
#include <iostream>
#include <vector>
int main()
{
std::vector<int> numbers = { 1, 2, 3, 4, 5 };
//使用基于范围的for循环遍历容器 - 使用引用修改元素
for (auto& num : numbers)
{
num = num + 1;
}
//若无需修改容器中的元素,可以使用const限制
for (const auto& num : numbers)
{
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
//result
2 3 4 5 6
可以看到,基于范围的 for
循环使得遍历容器变得更加简洁和直观,无需关注容器的大小和索引,只需关注每次迭代中的元素值即可。这种语法在许多场景下都能提高代码的可读性和简洁性。
示例3: 使用基于范围的 for
循环遍历一个自定义类型的容器
#include <iostream>
#include <vector>
class Point
{
public:
int x, y;
Point(int x_, int y_) : x(x_), y(y_) {}
};
int main()
{
std::vector<Point> points = {{1, 2}, {3, 4}, {5, 6}};
// 使用基于范围的for循环遍历容器
for(const auto& point : points)
{
std::cout << "x: " << point.x << ", y: " << point.y << std::endl;
}
return 0;
}
//result
x: 1, y: 2
x: 3, y: 4
x: 5, y: 6
上述代码的循环中,每个 point
对象都是容器中的一个元素,可以通过 point.x
和 point.y
来访问其成员变量。基于范围的 for
循环使得遍历容器元素变得简洁明了,更利于代码维护。
三、优点:
基于范围的 for
循环优点如下:
- 无需显式定义迭代器或索引变量。
- 自动处理容器边界,避免越界访问。
- 支持只读访问元素,无法修改容器中的元素值。
- 循环变量的生命周期仅限于当前循环迭代,循环结束后不再有效。
- 循环变量的类型可以是自定义类型,只要对象支持迭代器的访问方式。