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