范围基 for
循环(Range-based for loop)是 C++11 引入的一种更简洁、更安全的遍历容器(如数组、向量、列表等)的方式。它简化了传统 for
循环和迭代器的使用,使代码更加清晰易读。下面详细介绍范围基 for
循环的语法、用法和一些注意事项。
语法
范围基 for
循环的基本语法如下:
cpp
for ( : ) {
// 循环体
}
其中,range
是要遍历的容器,element
是每次迭代中从容器中取出的元素的副本或引用。
示例
假设我们有一个 vector<int>
,我们想遍历它并输出每个元素:
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用范围基 for 循环遍历 vector
for (int element : vec) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
1. 遍历数组
范围基 for
循环同样适用于数组:
cpp
#include <iostream>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用范围基 for 循环遍历数组
for (int element : arr) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
2. 遍历字符串
范围基 for
循环也可以用于遍历字符串:
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 使用范围基 for 循环遍历字符串
for (char ch : str) {
std::cout << ch << " ";
}
std::cout << std::endl;
return 0;
}
输出:
H e l l o , W o r l d !
3. 修改容器中的元素
如果需要在遍历过程中修改容器中的元素,可以使用引用:
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用范围基 for 循环遍历并修改 vector
for (int &element : vec) {
element *= 2; // 修改元素
}
// 输出修改后的 vector
for (int element : vec) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
2 4 6 8 10
4. 遍历自定义容器
范围基 for
循环也可以用于自定义容器,只要该容器支持迭代器操作:
cpp
#include <iostream>
#include <vector>
class MyContainer {
public:
std::vector<int> data;
// 构造函数
MyContainer(const std::vector<int>& d) : data(d) {}
// 返回迭代器
auto begin() { return data.begin(); }
auto end() { return data.end(); }
};
int main() {
MyContainer container({1, 2, 3, 4, 5});
// 使用范围基 for 循环遍历自定义容器
for (int element : container) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4 5
注意事项
-
引用与副本:
-
使用
int element
时,element
是容器中每个元素的副本。 -
使用
int &element
时,element
是容器中每个元素的引用,可以修改原元素。 -
使用
const int &element
时,element
是容器中每个元素的常量引用,不能修改原元素,但可以提高效率。
-
-
性能考虑:
-
如果不需要修改容器中的元素,使用
const
引用可以提高性能,因为避免了不必要的复制。 -
如果需要修改容器中的元素,使用非
const
引用。
-
-
范围基
for
循环的限制:- 范围基
for
循环不适用于需要同时访问多个元素(如前一个和后一个元素)的场景。在这种情况下,传统的for
循环或迭代器可能更合适。
- 范围基
总结
范围基 for
循环是一种简洁、安全的遍历容器的方式,适用于大多数需要遍历容器的场景。通过合理使用引用和常量引用,可以提高代码的效率和可读性。