如何从用户定义的函数返回 3D 数组?

Pra*_*rma 5 c++ arrays function multidimensional-array c++11

我想将一个 3 维数组从用户定义的函数返回到我的main函数中。

让我们考虑一个关于abc数组的任何特定值的简单示例;

int*** my_function(int a[], int b[], int c[])
{
   for (int i = 0; i < 2; i++)
   {
      for (int j; j < 2; j++)
      {
         for (int k; k < 2; k++)
         {
            array[i][j][k] = a[i] * b[j] * c[k];
         }
      }
   }
   return array
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*sta 5

只是备注: anint ***不适合返回 3D 数组。它最多可用于返回一个指向指针数组的指针。

由于原始数组不是 C++ 语言中的第一类元素,因此您无法以简单自然的方式从函数返回数组。

可以做什么?

  1. C++简单的方法:

    不要使用原始数组,但std::array如果在编译时固定,则大小是固定的,std::vector如果不是,则大小是固定的。然后,您可以构建 ( 并返回向量的向量 或std::array的向量std::array。请注意,向量的向量就像指针数组:数据不需要连续,因此它不等于 3D 数组。这里,假设固定大小:

     std::array<std::array<std::array<int, 2>, 2>, 2> my_function(int a[], int b[], int c[])
     {
       std::array<std::array<std::array<int, 2>, 2>, 2> array;
       ...
       return array;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 自定义容器(仍然是现代 C++)

    如果您需要在 C++ 中模拟 3D 连续容器并使其表现得像普通对象(可以从函数返回),则必须构建自定义容器及其访问器方法。它并不是极其复杂,但也绝非微不足道。如果你想这样做,我的建议是使用(1D)向量作为底层存储,这样就不用担心原始分配存储的复制、移动、破坏问题。

  3. C-ish 方式(使用原始数组)。

    多维数组必须具有除最后一个维度之外的所有维度,这是在编译时定义的。话虽如此,你仍然会发现 3 种常见的 C 存储方式:静态存储(可以安全返回,但不是线程安全的)、分配存储(线程安全,但调用者将负责释放它)、调用者提供的(调用者负责创建数组并将其传递给被调用者函数。我将在这里向您展示第三种方法

     typedef int (*int3D)[2][2];
    
     int3D my_function(int a[], int b[], int c[], int3D array) {
     {
       for(int i=0; i<2; i++)
       {
         ...
       }
       return array;
     }
    
    Run Code Online (Sandbox Code Playgroud)

    用法:

     int arr[2][2][2];
    
     int3D arr3D = my_function(a, b, c, arr);
     // after the call, arr3D == arr is true
    
    Run Code Online (Sandbox Code Playgroud)


Ayu*_*ain 2

使用指针的更好替代方法是使用std::vectoras ,它将处理内存分配和释放的细节。

如何初始化3D向量?

3D 矢量只是一个内部包含两个其他矢量的矢量。因此,如果您想用值 A 初始化大小为 X * Y * Z 的 3D 向量,则可以这样做:

vector<vector<vector<int> > > vec (X,vector<vector<int> >(Y,vector <int>(Z,A)))
Run Code Online (Sandbox Code Playgroud)

如何从函数中返回它?

您可以从下面的示例中了解如何返回它。

vector<vector<vector<int> > >  sample_function()
{

     //sample code

return vec;
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,嵌套向量的缺点是它在幕后进行指针取消引用。对于 3D 向量,这意味着它必须取消引用 3 个指针。这比使用 1D 向量并使用一些算术将 3 个索引转换为 1D 向量的一个偏移量的效率要低。所以在这种情况下它可能看起来像:`std::vector vec(2 * 2 * 2); ...; vec[i + 2 * (j + 2 * k)] = a[i] * b[j] * c[k];` (2认同)