提问者:小点点

如何在C++中从用户定义函数返回三维数组?


我想把一个3维数组从一个用户定义的函数返回到我的主函数中,让我们考虑一个简单的例子,a,b和c数组的任何特定值;

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
}

共3个答案

匿名用户

使用指针的一个更好的替代方法是使用std::vector,因为它将负责内存分配和释放的细节。

如何初始化三维矢量?

3D向量简单地说就是一个向量,里面包含另外两个向量。 所以,如果你想用一个值a来初始化一个大小为X*Y*Z的3D向量,那么可以这样做:

vector<vector<vector<int> > > vec (X,vector<vector<int> >(Y,vector <int>(Z,A)))

如何从函数返回它?

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

vector<vector<vector<int> > >  sample_function()
{
     for(int i=0; i<2; i++)
          {
               for(int j; j<2; j++)
                     {
                          for(int k; k<2; k++)
                                {
                                      vec[i][j][k]=a[i]*b[j]*c[k];
                                }
                      }
           }
return vec;
}

匿名用户

您可以使用std::array

如果大小是已知的编译时间,我建议使用std::array,通过它可以获得连续的内存布局。

#include <iostream>
#include <array>
#include <algorithm> // std::generate

// alias for the required array
using Array3D = std::array<std::array<std::array<int, 2>, 2>, 2 >;

Array3D func()
{
   Array3D arr3d;
   std::array<int, 2> a{ 10, 20 }, b{ 10, 20 }, c{ 10, 20 }; // some a, b, c


   // iterate through the arrays to initialize them!
   auto input = 1u;
   for (std::array<std::array<int, 2>, 2> & array2D : arr3d) // or auto& array2D: arr3d
      for (std::array<int, 2> & arr : array2D)                // or auto& arr: array2D
         std::generate(arr.begin(), arr.end(), [&input] { return input++; });

   // for array multimplications!
   for (std::array<std::array<int, 2>, 2> & array2D : arr3d) // or auto& array2D
   {
      for (std::array<int, 2> & arr : array2D)               // or auto& arr
      {
         auto arrIndex = 0u;
         for (int& ele : arr)
         {
            ele = a[arrIndex] * b[arrIndex] * c[arrIndex];
            ++arrIndex;
            std::cout << ele << " "; // to print the element!
         }
      }
   }

   return arr3d; // return the array like this!
}

或者使用模板化函数(将大小作为非模板参数),您甚至可以通过引用传递Array3D,并进行上面所示的计算!

#include <iostream>

template<std::size_t M, std::size_t N, std::size_t O>
void func(int (&arr3d)[M][N][O])
{
   // some a, b, c

   for (std::size_t i = 0; i < M; ++i)
   {
      for (std::size_t j = 0; j < N; ++j)  
      {
         for (std::size_t k = 0; k < O; ++k)
         {
            arr3d[i][j][k] = a[k] * b[k] * c[k];
            std::cout << arr3d[i][j][k] << " "; // to print the element
         }
         std::cout << "\n";
      }
      std::cout << "\n";
   }
   // do not need to return!
}

匿名用户

正如其他人提到的,您可以使用std::arraystd::vector,但一个简单的方法是将数组作为参数传递给您的函数(而不是返回)。 像这样的事:

void your_function(int array[2][2][2], /* other parameters */) {
    // body
}

然后像这样使用它:

int main() {
    int arr[2][2][2];
    your_function(arr, /* other arguments */);
    // now do what you want with arr
}

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|中|用户|定义|函数|返回|三维|数组)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?