使用单个连续的内存块索引3维数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用单个连续的内存块索引3维数组相关的知识,希望对你有一定的参考价值。
vector<bool> working_lattice(box.rect.length * box.rect.height * box.rect.width);
如何使用上述声明的方式访问working_lattice[1][5][3]
?
答案
您需要以其身份访问它
(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);
编辑:因为你在其他地方提到过x,y,z
working_lattice[(x * box.rect.length * box.rect.height) + (y * box.rect.height) + z);
另一答案
这取决于您是使用行主要还是列主要排序。 Row-major在C / C ++中更为典型,但如果您手动执行,则可以执行任一操作。
在行主要排序中,要获得i,j,k'元素,你需要通过box.rect.height * box.rect.width * i
元素来达到i
th行,加上box.rect.width * j
元素到达该行的j
th列,加上k
到深入地回到k
th元素。要超级明确:
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]
这显然很烦人,所以你可能想要定义一个内联函数或者其他东西来帮助你。
另一答案
即考虑这个:
A[R][S][T]
假设它的基地址是addr_base_A
,
所以你希望你能得到一个特定元素A[i][j][k]
的地址,
我认为答案是:S*T*i + T*j + k + addr_base_A
。
希望这可以帮助 :)
以上是关于使用单个连续的内存块索引3维数组的主要内容,如果未能解决你的问题,请参考以下文章