基于范围的 for 如何适用于普通数组?
是不是读作“告诉我 ranged-for 做了什么(使用数组)?”
我会假设 - 以使用嵌套数组为例:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
文字版:
ia 是一个数组数组(“嵌套数组”),包含[3] 数组,每个数组都包含[4] 值。上面的示例通过 ia 的主要“范围” ([3]) 循环,因此循环 [3] 次。每个循环都会产生一个 ia 的 [3] 主要值,从第一个开始到最后一个结束 - 一个包含 [4] 值的数组。
- 第一个循环:
pl 等于 {1,2,3,4} - 一个数组
- 第二个循环:
pl 等于 {5,6,7,8} - 一个数组
- 第三个循环:
pl 等于 {9,10,11,12} - 一个数组
在我们解释过程之前,这里有一些关于数组的友情提示:
- 数组被解释为指向其第一个值的指针 - 使用不经过任何迭代的数组返回第一个值的地址
-
pl 必须作为参考,因为我们不能复制数组
- 对于数组,当您向数组对象本身添加一个数字时,它会向前推进很多次并“指向”等效条目 - 如果
n 是有问题的数字,那么ia[n] 与*(ia+n)(我们正在取消引用 n 条目的地址),ia+n 与 &ia[n] 相同(我们正在获取数组中该条目的地址)。
这是发生了什么:
- 在每个循环中,
pl 设置为ia[n] 的引用,n 等于从 0 开始的当前循环计数。因此,pl 是 ia[0] on第一轮,第二轮是ia[1],以此类推。它通过迭代检索值。
- 只要
ia+n 小于end(ia),循环就会继续。
...就是这样。
这真的只是一个简化的写法:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
如果你的数组不是嵌套的,那么这个过程会变得更简单一点,因为不需要需要引用,因为迭代的值不是数组而是而是一个“正常”值:
int ib[3] = {1,2,3};
// short
for (auto pl : ib)
cout << pl;
// long
for (int n = 0; n != 3; ++n)
cout << ib[n];
一些附加信息
如果我们不想在创建pl 时使用auto 关键字怎么办?那会是什么样子?
在以下示例中,pl 指的是 array of four integers。在每个循环上 pl 被赋予值 ia[n]:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
而且...这就是它的工作原理,通过附加信息来消除任何混乱。它只是一个“速记”for 循环,它会自动为您计数,但缺少一种无需手动操作即可检索当前循环的方法。