在 C++11 中,引入了一种新的循环结构——范围基于
for
循环(Range-Based For Loop)。这种语法旨在简化遍历容器(如vector
、list
、array
等)中的所有元素的过程,使代码更加简洁和易读。范围基于for
循环允许开发者以更直观的方式遍历容器中的元素。与传统的for
循环相比,它不再需要显式地使用索引或迭代器,使代码更加简洁和可读。
目录
范围基于 for
循环语法
基本语法如下:
for (type var : container) {
// 使用 var 处理容器中的元素
}
- type: 容器中元素的类型。
- var: 每次迭代时的循环变量,表示当前容器中的元素。
- container: 要遍历的容器。
使用方法扩展
使用 auto
关键字
当容器的元素类型复杂或难以手动指定时,可以使用 auto
关键字来自动推导类型:
std::vector<std::string> ssr = {"are", "you", "ok"};
for (auto a : ssr)
使用引用来修改元素
如果希望在遍历时修改容器中的元素,可以使用引用来避免复制:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (int& num : numbers)
{
num *= 2;
}
使用常量引用
如果不希望修改元素,可以使用常量引用来确保元素不会被意外修改,并且可以避免不必要的复制开销:
for (const int& num : numbers)
优点和缺点
优点
- 简洁性: 代码更加简洁,易于阅读,减少了手动管理迭代器的需求。
- 安全性: 减少了越界访问的风险,因为不需要使用索引。
- 灵活性: 可以遍历任何支持范围遍历的容器,包括
vector
、list
、array
等。
缺点
- 性能考虑: 对于复杂类型的元素,使用范围基于
for
循环可能会导致性能问题,因为每次迭代时都会复制元素。(使用引用可以解决这个问题) - 功能限制: 范围基于
for
循环不支持直接访问元素的索引,如果需要索引信息,仍需使用传统的for
循环。
完整代码演示
#include <bits/stdc++.h>
int main() {
std::vector<int> num1 = {1, 2, 3, 4, 5};
for (int num : num1) {
std::cout << num << " "; // 输出每个元素
}
std::cout << std::endl;
// auto 关键字自动推导类型
std::vector<std::string> ssr = {"are", "you", "ok"};
for (auto a : ssr)
{
std::cout << a << " ";
}
std::cout << std::endl;
// 使用引用修改元素
std::vector<int> num2 = {1, 2, 3, 4, 5};
for (int& num : num2) {
num *= 2;
}
//使用常量引用以避免复制
for (const int& num : num2) {
std::cout << num << " ";
}
return 0;
}