在C++11中,引入了一种新的循环结构,即范围for循环(range-based for loop),它提供了一种简洁且安全的方式来遍历容器(如数组、向量std::vector
、列表std::list
等)或其他序列。范围for循环能够自动处理迭代过程,从而减少了传统for循环或迭代器使用中可能出现的错误。
以下是范围for循环的基本语法:
cpp复制代码
for (declaration : range) { | |
// 循环体 | |
} |
declaration
:这是循环变量的声明。在每次迭代中,它会被初始化为range
中的一个元素。其类型会自动推导,但你也可以显式指定。range
:这表示要遍历的序列或容器。
范围for循环会遍历range
中的每个元素,并在每次迭代中将当前元素的值赋给declaration
声明的变量。
示例代码
以下是一些使用范围for循环的示例:
cpp复制代码
#include <iostream> | |
#include <vector> | |
#include <list> | |
#include <array> | |
int main() { | |
// 遍历数组 | |
int arr[] = {1, 2, 3, 4, 5}; | |
for (int val : arr) { | |
std::cout << val << " "; | |
} | |
std::cout << std::endl; | |
// 遍历向量 | |
std::vector<int> vec = {10, 20, 30, 40, 50}; | |
for (int val : vec) { | |
std::cout << val << " "; | |
} | |
std::cout << std::endl; | |
// 遍历列表 | |
std::list<std::string> lst = {"apple", "banana", "cherry"}; | |
for (const std::string& str : lst) { | |
std::cout << str << " "; | |
} | |
std::cout << std::endl; | |
// 遍历数组(使用auto自动推导类型) | |
std::array<double, 3> arr2 = {1.1, 2.2, 3.3}; | |
for (auto val : arr2) { | |
std::cout << val << " "; | |
} | |
std::cout << std::endl; | |
// 遍历容器中的元素并修改(使用引用) | |
std::vector<int> vec2 = {1, 2, 3, 4, 5}; | |
for (auto& val : vec2) { | |
val *= 2; // 将每个元素乘以2 | |
} | |
for (auto val : vec2) { | |
std::cout << val << " "; | |
} | |
std::cout << std::endl; | |
return 0; | |
} |
注意事项
-
类型推导:在范围for循环中,循环变量的类型会自动推导为与
range
中的元素类型相匹配。但你也可以显式地指定类型,如果希望与range
中的元素类型不完全一致(例如,使用const
引用以避免不必要的复制)。 -
修改容器中的元素:如果需要在循环中修改容器中的元素,应该使用引用类型(
auto&
)来声明循环变量。 -
只读访问:如果只需要读取容器中的元素而不需要修改它们,可以使用
const
引用(const auto&
)来提高效率并避免不必要的复制。 -
范围for循环与原始迭代器:范围for循环在内部使用迭代器来遍历容器,但它为开发者提供了一个更高层次的抽象,从而简化了代码并减少了出错的可能性。