用1个循环解释二维数组迭代



有人能解释一下为什么这个算法可以将2D数组迭代为1D数组吗?换句话说……一个循环?

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开始,我们将得到:

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就会增加1。利用i % Width,这将在特定的i / Width上循环每个值(在本例中为0到5)。因为整数除法是截断的,所以在i成为Width的下一个倍数之前,这个数是相同的。

为二维数组分配的内存仍然是线性布局的。因此,如果你要检查变量Array的内存,它将由Width number of int Width number of int 组成。for Height times.

<<p>如果宽度/strong> = 5,和高度 = 2…数组的内存看起来像这样(其中每个[]集合是一个整数):

[w0/h0] [w1/h0] [w2/h0] [w3/h0] [w4/h0] [w0/h1] [w1/h1] [w2/h1] [w3/h1] [w4/h1]

当你使用Array[j][i]访问数组时,它会自动为你做计算,正确地偏移到线性内存块

您没有将其用作1D数组。你仍然把它索引为一个二维数组。但是,您将使用数学(模和整数除法)根据数组的维度从1D索引中恢复2D索引。这是很正常的,但是在循环中这样做是不寻常的,因为它可能会在计算上很昂贵。

for (int x = 1, y = 1; y <= 5; (x < 5) ? (x++) : (x = 1, y++))

对不起。

最新更新