2016-05-16 12 views
0

として一次元配列を扱う私は
二次元

int* a = new int[n * m]; 

1次元配列を持っていると私は私が遊んで試してみました

a[i][j] = a[n * i + j] 

すなわち二次元として扱う必要がありますディレクティブを使用して、たくさんのグーグルグーグル。しかし、何も私のために働いた。
これを行う方法はありますか? Smt。 define a[i][j] a[n * i + j]のように?
ありがとうございます。

+0

私はあなたにはあまり検索がないと思うhttp://stackoverflow.com/questions/7492842/convert-one-dimensional-arrary-to-two-dimensional-in-c –

+0

すべての 'array_view'、またはGSLの' span 'クラスは配列自体について何も変更せずにこれを行うことができるはずです。 – chris

+0

データを連続させたいので1つの割り当てしかないと思いますか? –

答えて

1

あなたは、配列を保持しているラッパークラスを作成し、operator[]機能n * i + j計算を実行し、希望の要素への参照を返すプロキシオブジェクトを返すoperator[]機能を持っている可能性があり、C++でプログラミングしているので。

別の方法としては、インライン関数や引数として配列とインデックスを取り、要素を返す関数のようなマクロを作成することができます。

しかし、ラッパークラスのSams answer内の1つのようなハックせずに、あなたが望むように配列の「真」の配列を取得する方法はありません。

2

あなたはポインタが含まれている二番目の配列を定義する必要があります。このような何か:その後

int **b=new int *[m]; 

for (int i=0; i<m; ++i) 
    b[i]=&a[i*n]; 

b[i][j]a[n*i+j]を参照します。

+0

これは可能な解決策ですが、単一の「配列」ではなく、主にローカリティとCPUキャッシングに関するいくつかの問題があります。 –

+0

私はポインタの配列を割り当てたくないし、それぞれポインタのそれぞれにメモリを割り当てます。私はちょうど置換 '[i] [j]は答えのコードは実際にはそれがないと思う何をしないことに注意してください@T_Igor [N * iの+ J]' –

+0

を=します。ループは割り当てだけではなく、メモリを割り当てます。 –