for(auto a:b)用法

本文介绍了C++中如何使用范围for循环遍历数组或容器,并对比了通过引用与非引用方式遍历的区别。当使用引用时,可以修改容器内的元素。

for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。

for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。

int arr[10];
for(int i=0;i<10;i++)
{
  arr[i]=i;
}
for(auto &a:arr)
{
  std::cout << a;
}

输出结果 0 - 9

### C++ 中 Range-Based For 循环的使用规则及 b 的类型要求 在 C++11 引入的范围基循环(Range-Based For Loop)中,其基本语法如下[^5]: ```cpp for (declaration : range) { // 循环体 } ``` 其中 `declaration` 是一个变量声明,用于逐一绑定到 `range` 中的每个元素。`range` 表示要遍历的容器或数组。 #### b 的类型要求 `b` 在此上下文中通常指代 `range`,即循环所操作的范围对象。根据 C++ 标准,`range` 必须满足以下条件之一才能被用作范围基循环的范围对象[^4]: 1. **支持解引用和迭代的容器**:`range` 必须是一个支持迭代的容器(如 `std::vector`、`std::list` 或 `std::array`),并且可以通过 `.begin()` 和 `.end()` 方法返回有效的迭代器。 2. **数组**:`range` 可以是固定大小的数组,编译器会自动推导其范围。 3. **自定义类型**:如果 `range` 是一个用户定义的类类型,则该类必须提供 `.begin()` 和 `.end()` 成员函数,分别返回指向范围起始和结束位置的迭代器。 #### 普通变量作为 `range` 普通变量是否可以作为 `range` 取决于该变量的类型和特性。如果普通变量是一个简单的标量类型(如 `int`、`double` 等),则它不能直接用作范围基循环的范围对象,因为这些类型不支持迭代器接口。例如,以下代码会导致编译错误: ```cpp int b = 10; for (int x : b) { // 编译错误 std::cout << x << " "; } ``` 然而,如果普通变量是一个容器或数组,则它可以作为范围对象。例如: ```cpp std::vector<int> b = {1, 2, 3, 4, 5}; for (int x : b) { // 正确 std::cout << x << " "; } ``` 此外,如果普通变量是一个支持 `.begin()` 和 `.end()` 的自定义类型实例,也可以作为范围对象。例如: ```cpp class MyContainer { public: std::vector<int> data; MyContainer() : data{1, 2, 3, 4, 5} {} auto begin() { return data.begin(); } auto end() { return data.end(); } }; MyContainer b; for (int x : b) { // 正确 std::cout << x << " "; } ``` #### 使用引用与常量引用 在声明部分(`declaration`),可以选择值类型、引用类型或常量引用类型来绑定范围中的元素。例如: - 值类型:`int x` 会在每次迭代时复制元素[^4]。 - 引用类型:`int& x` 允许修改原始容器中的元素[^4]。 - 常量引用类型:`const int& x` 避免复制并防止修改原始元素[^4]。 #### 示例代码 以下是一个完整的代码示例,展示了不同类型的范围对象及其使用方式: ```cpp #include <iostream> #include <vector> class MyContainer { public: std::vector<int> data; MyContainer() : data{1, 2, 3, 4, 5} {} auto begin() { return data.begin(); } auto end() { return data.end(); } }; int main() { // 容器作为范围对象 std::vector<int> container = {1, 2, 3, 4, 5}; for (int x : container) { std::cout << x << " "; // 输出 1 2 3 4 5 } std::cout << std::endl; // 数组作为范围对象 int array[] = {6, 7, 8, 9, 10}; for (int x : array) { std::cout << x << " "; // 输出 6 7 8 9 10 } std::cout << std::endl; // 自定义类型作为范围对象 MyContainer custom; for (int x : custom) { std::cout << x << " "; // 输出 1 2 3 4 5 } std::cout << std::endl; // 普通变量(非容器或数组)不能作为范围对象 // int scalar = 10; // for (int x : scalar) {} // 编译错误 return 0; } ``` ### 总结 C++ 范围基循环中的 `range` 必须支持迭代器接口,普通变量只有在其类型符合这一要求时才能作为范围对象。对于标量类型的普通变量,无法直接用作范围对象。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值