C ++ 11 range-for循环遍历多维数组

时间:2014-09-20 22:50:45

标签: c++ c++11

我从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]一样?

1 个答案:

答案 0 :(得分:9)

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

当您说for (auto x : y)时,x是范围元素的副本。但是,无法复制数组,因此当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;