主题
range-based for 循环
在 C++11 中,range-based for
循环提供了一种简洁的方式来遍历容器或数组。与传统的 for
循环相比,range-based for
循环使得代码更简洁,减少了出错的机会,特别是在遍历容器时。
range-based for 循环语法
cpp
for (declaration : container) {
// 访问 container 中的每个元素
}
declaration
:表示每个元素的类型,通常是引用或值类型。container
:可以是数组、容器(如vector
、list
、map
等)或其他支持迭代的对象。
示例:遍历数组
cpp
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
// 使用 range-based for 循环遍历数组
for (int num : arr) {
cout << num << " ";
}
cout << endl;
return 0;
}
在此例中,num
将依次获取数组 arr
中的每个元素,并打印出来。
示例:遍历 vector
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {10, 20, 30, 40, 50};
// 使用 range-based for 循环遍历 vector
for (int num : v) {
cout << num << " ";
}
cout << endl;
return 0;
}
此示例中,v
是一个 vector
,通过 range-based for
循环遍历其中的每个元素。
引用与值
默认情况下,range-based for
循环会复制元素。如果需要修改容器中的元素,可以使用引用类型。
示例:使用引用修改容器中的元素
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// 使用引用来修改元素
for (int& num : v) {
num *= 2; // 将每个元素乘以 2
}
// 输出修改后的 vector
for (int num : v) {
cout << num << " ";
}
cout << endl;
return 0;
}
在此例中,通过引用 int& num
来修改 v
中的每个元素,使每个元素的值都翻倍。
常见错误
忘记引用类型
当你希望修改元素时,忘记加上引用类型会导致创建元素的副本,从而无法改变容器中的实际内容。
示例:没有引用的错误
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// 错误:没有引用,不能修改原始元素
for (int num : v) {
num *= 2; // 只是修改了 num,而不是 v 中的元素
}
for (int num : v) {
cout << num << " ";
}
cout << endl; // 输出仍然是 1 2 3 4 5
return 0;
}
在此例中,由于没有使用引用,修改的是 num
的副本,容器 v
中的元素并没有变化。
总结
range-based for
循环使得遍历容器或数组更加简洁。- 默认情况下,元素会被复制。如果需要修改元素,使用引用。
- 使用
range-based for
循环时,避免忘记加引用类型,这样才能修改容器中的实际元素。
通过 range-based for
循环,C++ 代码可以变得更加简洁、清晰,减少了手动管理迭代器和循环变量的复杂度。