1

単一のインデックスで多次元配列にインデックスを付けることはできますか?

元:

メモリ内では、多次元配列は 1 つの配列のようにインデックス付けされます (行列 2x2 の例では、matrix[1][1] は配列の 4 番目の要素、"matrix[3]" です)。この表記法を自動的に使用するシステムはありますか? matrix[1][1] の代わりに matrix[3] を書きたい: 可能ですか?

4

2 に答える 2

6

データへのアクセス方法に応じて、1 つのインデックスを簡単に使用することも、2 つの方法を使用することもできます。2 つのインデックスを受け入れるメソッドは、データがどのようにアクセスまたは使用されるかに応じて、優先または列優先になります。もちろん、それを行うには、行列を一次元配列に格納する必要があります。例えば:

class Matrix {
  int data[W*H];

  int get(int i) { return data[i]; }
  int get(int x, int y) { return data[y*W+x]; }
}
于 2013-03-10T17:06:29.253 に答える
3

@Jackの答えを使用して実際の例を追加するだけです:行メジャーと言語C(c ++ではない)の場合でも、同じように機能します!

#include<stdio.h>
#define R 2
#define C 2
int main(){
  int data1[R*C]={ 1, 2,
                   3, 4
                 };
  int data2[R*C]={ 3, 5,
                   7, 8
                 };
  int result[R*C]={0 };
  int r,c;
  for(r=0; r< R ; r++){
     for(c=0; c< C ; c++){
      result[r*C + c]= data1[r*C + c]  + data2[r*C + c];
     }
  }
  printf("\nMatrix SUM\n");
  for(r=0; r< R ; r++){
     for(c=0; c< C ; c++){
      printf("%-3d ",result[r*C + c]);
    }
    printf("\n");
  }
  return 1;
} 

出力:

Matrix SUM
4   7   
10  12  

あなたはcodpadeでそれが働いているのを見ることができます

以下のように、マクロを使用してインデックス式をきれいに保つことができます

#define INDEX(r, c)  r*C + c

以下のようなマクロを使用します。

data2[INDEX(r,c)];  

私の例のすべての配列は 1 次元ですが、私のコーディング スタイルは 2 次元行列で作業しているようなものです。これは魔法ではありませんが、2D 配列はコンパイラ レベルの内部で同様の方法で実装されています。

于 2013-03-10T17:24:05.423 に答える