有人可以解释为什么这个算法可以将2D数组作为一维数组进行迭代吗?换句话说......有一个循环?
const int Width = 6;
const int Height = 4;
int Array[Width][Height];
for (int I = 0; I < Width * Height; ++I)
{
Array[I % Width][I / Width] = I; //This line :S
}
for (int I = 0; I < Height; ++I)
{
for (int J = 0; J < Width; ++J)
{
std::cout<<Array[J][I]<<" ";
}
std::cout<<"\n";
}
答案 0 :(得分:7)
了解其工作原理的最简单方法是自行插入数字。从0开始,我们将得到:
Array[0 % 6][0 / 6] = Array[0][0]
Array[1 % 6][1 / 6] = Array[1][0]
...
Array[5 % 6][5 / 6] = Array[5][0]
Array[6 % 6][6 / 6] = Array[0][1]
...
Array[11 % 6][11 / 6] = Array[5][1]
等等。因为它使用整数除法,所以每次我们通过Width
值时,它i / Width
将是另一个。利用i % Width
,这将在特定i / Width
处循环遍历每个值(在本例中为0到5)。因为整数除法会截断,所以在i
成为Width
的下一个倍数之前,这将是相同的。
答案 1 :(得分:1)
您没有将它用作一维数组。您仍然将其索引为2D数组。但是,您正在使用数学(模和整数除法)根据数组的维度从一维索引中恢复二维索引。这是很正常的,但是在循环中执行此操作是不常见的,因为它可能在计算上很昂贵。
答案 2 :(得分:1)
为2维数组分配的内存仍然是线性排列的。因此,如果您要检查变量 Array 的内存,它将包含宽度 ints 的数量,后跟宽度强烈> 整数再次... 高度次。
如果宽度 = 5,高度 = 2 ... 数组的内存看起来像这样(每个[] set是一个整数):
[W0 / H0] [W1 / H0] [W2 / H0] [W3 / H0] [W4 / H0] [W0 / H1] [W1 / H1] [W2 / H1]的[W3 / H1] [W4 / H1]
使用 Array [j] [i] 访问数组时,它会自动为您进行数学运算,以正确地偏移到线性内存块中。
答案 3 :(得分:1)
for (int x = 1, y = 1; y <= 5; (x < 5) ? (x++) : (x = 1, y++))
对不起。