首页 > 解决方案 > 如何从用户定义的函数返回 3D 数组?

问题描述

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

a让我们考虑一个简单的例子,用于,bc数组的任何特定值;

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
}

标签: c++arraysfunctionc++11multidimensional-array

解决方案


只是备注: 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;
     }
    
  2. 自定义容器(仍然是现代 C++)

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

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

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

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

    用法:

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

推荐阅读