3
vector<bool> working_lattice(box.rect.length * box.rect.height * box.rect.width); 

上記の宣言スタイルを使用してworking_lattice[1][5][3]にアクセスするにはどうすればよいですか?連続した1つのメモリブロックを使用して3次元配列にインデックスを付ける

+0

私はそれが 'working_lattice [? *? *? +?] '。しかしどうですか? – unixman83

+0

現時点では、「ベクトル」に関連する奇妙なことを無視して、[古い回答](http://)の 'matrix [a] [b] [c]'表記を使ってアクセスできる3Dマトリックスを示しました。 stackoverflow.com/a/2216055/179910)。現時点では、サイズをテンプレートパラメータとして渡しますが、代わりにctorパラメータとして渡すには膨大な量がかかりません。私が今日書いていたのであれば、間違いなく実際の3D配列の代わりに 'std :: vector'を使用して、ctorにサイズを渡すのは簡単です。 –

+0

3つのネストされたベクトルは、各ベクトル自体が連続したメモリブロックに格納されるため、1つの連続したメモリブロックとしても格納されます。これはまた、あなたにオフセットを計算するための乗算作業をマシンにさせるでしょう。 –

答えて

4

あなたはあなたのケースでそう

(i * length * height) + (j * height) + k 

としてそれにアクセスする必要が

working_lattice[(i * box.rect.length * box.rect.height) + (j * box.rect.height) + k); 

または

working_lattice[(1 * box.rect.length * box.rect.height) + (5 * box.rect.height) + 3); 

EDIT:あなたは、X、Yを述べたので、zの他の場所

working_lattice[(x * box.rect.length * box.rect.height) + (y * box.rect.height) + z); 
+0

downvoterは理由についてコメントできますか?彼はすでに答えとしてそれを受け入れた – josephthomas

3

これは、行メジャーと列メジャーのどちらを使用しているかによって異なります。 Row-majorはC/C++でより一般的ですが、手動で行う場合はどちらでも実行できます。

行優先順序で

は、I、J、k番目の要素を取得するために、あなたはのj番目の列を取得するi行目までを取得するにはbox.rect.height * box.rect.width * i要素を通過する必要があり、プラスbox.rect.width * j要素その行にkを追加して、要素を深さ方向にkに戻します。スーパー明示的に指定するには:

const size_t n_x = box.rect.length; 
const size_t n_y = box.rect.height; 
const size_t n_z = box.rect.width; 
working_lattice[1 * n_x * n_z + 5 * n_z + 3] 

これは明らかにかなり迷惑ですので、あなたは、インライン関数または助けるために何かを定義することもできます。

関連する問題