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

如何使用上述声明风格访问working_lattice[1][5][3]使用单个连续内存块索引3维阵列

+0

我知道它看起来更像'working_lattice [? *? *? +?]'。但是如何? – unixman83 2012-04-14 06:02:10

+0

暂时忽略与“矢量”相关的奇怪现象,我展示了一个3D矩阵,您可以使用[矩阵[a] [b] [c]'符号在[旧回答](http:// stackoverflow.com/a/2216055/179910)。目前,它将尺寸作为模板参数传递,但不需要大量的将它作为ctor参数传递。如果我今天写了它,我毫无疑问会使用'std :: vector'而不是实际的3D数组,这将使得将尺寸传递给ctor变得微不足道。 – 2012-04-14 06:10:47

+0

由于每个矢量本身都存储在连续的内存块中,所以三个嵌套矢量也将作为一个连续的内存块存储。这也可以让机器完成乘法工作来计算出偏移量。 – 2012-04-14 06:28:41

回答

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); 

编辑:既然你提到的X,Y,Z别处

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

downvoter可以评论为什么?他也已经接受了这个答案 – josephthomas 2012-04-15 00:59:09

3

这取决于您是使用行主要还是列主要排序。在C/C++中行优先级更为典型,但如果您手动执行,则可以执行任何操作。

行优先排序,才能到I,J,k个元素,你需要经过box.rect.height * box.rect.width * i元素起床到i个行,加上box.rect.width * j元素去的j列该行,再加上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] 

这显然很烦人,所以你可能想定义一个内联函数或其他东西来帮忙。