多维数组上循环的C++11范围

C++11 range-for loop over multidimensional array

本文关键字:C++11 范围 循环 数组      更新时间:2023-10-16

我要从C(ANSI)跳到C++11中。这确实是一个奇怪的世界。

我正在努力解决以下问题:

int tbl[NUM_ROWS][NUM_COLS] = { 0 };
for (auto row : tbl)
  for (auto col : row) // ERROR - can't iterate over col (type int *)
    // do stuff

我猜,这里的有理数相当于(在C中):之间的差

int v[] = { 1, 2, 3, 4, 5 };
int *u = v;
// (sizeof v) != (sizeof u);

然而,我不太明白以下是如何工作的:

int tbl[NUM_ROWS][NUM_COLS] = { 0 };
for (auto &row : tbl) // note the reference
  for (auto col : row)
    // do stuff

从逻辑上讲,我认为auto被类型化为int * const——这就是"数组"变量的含义,一个指向(可能)非常量元素的常量指针。但是,这怎么比普通指针更容易迭代呢?或者,由于row是一个引用,它实际上是对int [NUM_COLS]的类型,就像我们将row声明为int row[NUM_COLS]一样?

C++中没有"多维数组"。只有数组。但是,数组的元素类型本身可以是数组。

如果说for (auto x : y),则x是range元素的副本。但是,无法复制数组,因此当y是数组值数组时,这是无效的。相比之下,形成对数组的引用是非常好的,这就是for (auto & x : y)工作的原因。

也许这有助于拼写类型:

int a[10][5];  // a is an array of 10 elements of int[5]
for (int (&row)[5] : a)
    for (int & cell : row)
        cell *= 2;