2

このアルゴリズムが 2D 配列を 1D 配列として反復するために機能する理由を誰かが説明できますか? 言い換えれば.. 1つのループで?

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

1

2 次元配列に割り当てられたメモリは、引き続き線形に配置されます。したがって、変数Arrayでメモリを調べる場合、それはWidthの int 数と、それに続くWidthint数で構成されます... Height時間の場合。

= 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]を使用して配列にアクセスすると、メモリの線形ブロックに正しくオフセットするために、自動的にその計算が行われます。

于 2013-06-07T04:49:05.777 に答える
1

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

ごめんなさい。

于 2014-02-12T05:51:14.607 に答える
1

1D配列として使用していません。あなたはまだ2D配列としてインデックスを付けています。ただし、数学 (モジュロおよび整数除算) を使用して、配列の次元に基づいて 1D インデックスから 2D インデックスを復元しています。これはかなり正常ですが、計算コストが高くなる可能性があるため、これをループで行うのは珍しいことです。

于 2013-06-07T04:43:37.860 に答える