【问题标题】:Passing a 3-dimensional variable size array by reference in C++在 C++ 中通过引用传递一个 3 维可变大小数组
【发布时间】:2014-04-05 05:02:56
【问题描述】:

我一直在研究 Passing a 2D array to a C++ function 以及其他一些类似的文章。但是,我遇到了一个问题,我正在创建的数组有两个可变大小的维度。

初始化如下:

int** mulePosition;
mulePosition = new int *[boardSize][boardSize][2];

函数如下:

int moveMule (int boardSize, int ***mulePosition)

参考看起来像

moveMule (boardSize, mulePosition)

Boardsize 在函数的开头定义,但每次执行可能会改变。 适当大小的数组将是 int [boardSize][boardSize][2]。

【问题讨论】:

  • 使用一些合理的 C++ 类型,比如向量的向量。
  • 是的,代码不起作用。声明是 int** 但数组是 3 维的。但是,int*** 会抛出自己的错误。
  • @jbzdarkid 那是因为int*[n][n][2] 是一个由n 个数组组成的数组,其中n 个数组包含2 个指向int 的指针。这就是为什么您通常希望在有替代方案(例如包装平面数据结构或 typedef 的类)时使用这些组合类型。

标签: c++ arrays variables multidimensional-array pass-by-reference


【解决方案1】:

如果 boardSize 不是 const,则使用 std::vector<std::vector<int>>std::array<std::array<boardSize>, boardSize>(请参阅 Multidimensional std::array 了解如何初始化 std::array)。

话虽如此,将其隐藏在提供漂亮界面的类 Board 中似乎是个好主意。

【讨论】:

    【解决方案2】:

    要么使用普通的“3维”数组

    int* mulePosition = new int[boardsize*boardsize*2];
    

    并解决它的元素从头开始计算偏移量:mulePosition[a][b][c] is mulePosition[boardSize*2*a + 2*b + c],

    或使用数组数组的数组(对应于您的int*** 声明)或更好(更简单)的向量向量,尽管初始化会稍微复杂一些(您需要初始化每个数组/矢量)。

    【讨论】:

    • 如何初始化数组数组的数组?
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2014-04-13
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多