【问题标题】:Point to 3dimensional array in c++指向 C++ 中的 3 维数组
【发布时间】:2016-03-29 12:21:15
【问题描述】:

我在谷歌上搜索过,但只找到了一维数组的答案。

我有一个 3 维数组,用于存储稍后由函数处理的数据。 我的数组如下所示:levelcode[400][20][100]。它存储解码级别功能所需的所有信息。我立即收到堆栈溢出错误。

但是我如何指向整个数组来获取它的值(或者我如何传递整个数组?)?

我知道我可以在技术上为每个现有参数调用该函数,但我认为如果整个数组被向下传递或使用某种指针使用它会更快,并且看起来会更好。 我怎样才能做到这一点?

【问题讨论】:

  • 你看过类似问题的答案吗,比如这个:stackoverflow.com/questions/18283089/pointers-to-3d-arrays-c
  • 可以改用std::array吗?
  • 你能发布一些代码来展示你的数组是如何声明的吗?
  • 你有some_type name[][][]some_type name***吗?
  • 您应该考虑使用扁平的一维数组。您可以简单地使用std::vectorstd::array

标签: c++ arrays multidimensional-array visual-studio-2015


【解决方案1】:

我建议您使用std::vector。它基本上是一个自我管理的可增长数组。它动态存储数据(堆),因此您将使用完整的系统内存,而不是程序为自动对象(堆栈)提供的一小部分内存。使用您的levelcode[400][20][100],您有 800,000 个元素。如果数组的类型为int,那么您很可能需要 3.2MB 的空间用于该数组。通常这比提供给程序的空间大,并会导致stack overflow

我建议您使用单维向量,然后您可以使用数学来伪造 3 维。这将使数据对缓存更加友好,因为多维向量不必像多维数组那样让每个维度彼此相邻。

所以不是有一个

std::vector<std::vector<std::vector<some_type>>> name{DIM1, vector<vector<some_type>>{DIM2, vector<some_type>{DIM3}}};

并像使用它

name[x][y][z]

我们可以有一个

std::vector<some_type> name{DIM1 * DIM2 * DIM3};

然后你就可以访问元素了

name[x*DIM2*DIM3 + y*DIM3 + z]

【讨论】:

  • 我应该如何“伪造”它?我不能只使用其中的 3 个吗?
  • 如果没有任何示例,也没有解释如何将三个维度映射到一个维度,我认为这是一个不好的答案。
  • 此外,std::vector 当然是最好的容器,但它并不能真正解释堆栈分配溢出的原因。
  • @Chiel 当您发布您的 cmets 时,我正谈到这一点。希望这能解决这些问题。
  • -1 SO 问题的要求也应该适用于答案。答案应该是最少的,并且在没有多余信息的情况下解决问题。它还应该使用正确的术语。 “主要记忆”? “基于小程序的内存”?段错误与堆栈溢出?为什么要与“伪装”混淆?无论如何都需要缓存优化的证据在哪里?
猜你喜欢
  • 2013-01-26
  • 2016-05-08
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多