【问题标题】:Indexing a 3 dimensional array using a single contiguous block of memory使用单个连续内存块索引 3 维数组
【发布时间】:2012-04-26 10:37:20
【问题描述】:
vector<bool> working_lattice(box.rect.length * box.rect.height * box.rect.width);

如何使用上述声明方式访问working_lattice[1][5][3]

【问题讨论】:

  • 我知道它看起来更像working_lattice[? * ? * ? + ?]。但是怎么做呢?
  • 暂时忽略与vector&lt;bool&gt; 相关的奇怪之处,我展示了一个3D 矩阵,您可以使用matrix[a][b][c] 符号在old answer 中访问它。目前,它将大小作为模板参数传递,但将其作为 ctor 参数传递并不需要很大的数量。如果我今天写它,我无疑会使用 std::vector 而不是实际的 3D 数组,这样将大小传递给 ctor 就变得很简单了。
  • 三个嵌套向量也将存储为一个连续的内存块,因为每个向量本身都存储在一个连续的内存块中。这也可以让机器做乘法工作,为你计算出偏移量。

标签: c++ multidimensional-array arrayaccess integer-arithmetic


【解决方案1】:

这取决于您使用的是行优先还是列优先排序。 Row-major 在 C/C++ 中更为典型,但如果您手动进行,则可以这样做。

在行优先排序中,要到达第 i、j、k' 个元素,您需要经过 box.rect.height * box.rect.width * i 元素才能到达第 ith 行,再加上 box.rect.width * j 元素才能到达该行的jth 列,加上k 以深度返回kth 元素。要超级明确:

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]

这显然很烦人,因此您可能需要定义一个内联函数或其他帮助。

【讨论】:

    【解决方案2】:

    您需要以

    的身份访问它
    (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);
    

    【讨论】:

    • 反对者能否评论为什么?他也已经接受它作为答案了
    【解决方案3】:

    即考虑这个:

    A[R][S][T]
    

    假设它的基地址是addr_base_A

    所以你希望你能得到一个特定元素的地址A[i][j][k]

    我认为的答案是:S*T*i + T*j + k + addr_base_A

    希望这会有所帮助:)

    【讨论】:

    • 也许你可以画个图来帮助你理解,我是这样做的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2019-07-27
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2013-02-05
    • 2011-09-21
    • 2012-07-09
    相关资源
    最近更新 更多