2

有人可以解释为什么该算法适用于将 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";
}
4

4 回答 4

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

于 2013-06-07T04:45:12.280 回答
1

为二维数组分配的内存仍然是线性布局的。因此,如果您要检查变量Array中的内存,它将由Width整数组成,然后是Width整数......对于Height次。

如果Width = 5,Height = 2... Array的内存看起来像这样(其中每个 [] 集合都是一个整数):

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

当您使用Array[j][i]访问数组时,它只是自动为您进行数学运算,以正确偏移到线性内存块中。

于 2013-06-07T04:49:05.777 回答
1

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

于 2013-06-07T04:43:37.860 回答
1

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

对不起。

于 2014-02-12T05:51:14.607 回答