如何有效地将多个数组传递给一个函数

How to pass many arrays to a function effectively?

本文关键字:函数 一个 有效地 数组      更新时间:2023-10-16

我必须处理数组,处理这么多数组。我的问题是,是否可以用它们的名称访问它们。例如,我有这个数组a1,a2,a3,。。。,a40,并且我想将它们传递到一个函数中。是否可以将它们的名称保存在另一个变量中并将该变量传递到我的代码中,或者我必须在函数参数中写入所有数组?像这样的东西:

 double function(double ***a1,double ***a2,....,double ***a40)
 {
  .....
  }

我想做这样的事情:

  char names[40]={a1,...,a[40]};
       double function(char names)
 {
  .....
  }

请注意,我希望我的函数作用于数组(a1,a2,…)

您可以使用hash_map

myMap["a10"] = 5.0;

您可以按照上面的建议使用它们名称的哈希,或者只添加更多的*

void f(double*** a, double*** b)
{
   double*** r = b;
   b = a;
   a = r;
};
void g(double**** ar)
{
   double*** t = ar[0];
   ar[1] = ar[0];
   ar[0] = t;
}
double a_ = 0, b_ = 0;
double* pa_ = &a_, *pb_ = &b_;
double** ppa_ = &pa_, **ppb_ = &pb_;
double*** arr[2] = {&ppa_, &ppb_};
f(&ppa_, &ppb_);
g(arr);

但正如你所看到的,这个get相当笨拙(****,哇!)。你能解释一下,在你的代码中有这么多三重指针的情况下,你试图实现什么吗?这让我头疼。

试试这个:

double* arrays[] = {a1, ..., a40};
double function (double* arrays[])
{
  ...
}

解释

double* array[]声明了一个指向doubles的指针数组。假设CCD_ 4。。。,a40是双精度数组,您可以使用它们初始化arrays数组(数组和指针在某种程度上是同义的)

然后在函数中,你可以使用这个数组,并可以引用每个元素,比如arrays[0](相当于a1)。。。,arrays[39](相当于a40)。

我注意到在a1、…、。。。,函数原始版本中的a40。如果确实是这种情况,您可以将上面的double*替换为double***。不过,这看起来很可疑——很难正确处理这么多维度。

此外,我上面建议使用地址,而不是数组(*)的名称。这些名称仅供程序员使用,一旦您编译程序,它们就不会出现在可执行文件中,因此您不能通过名称来引用它们。然而,他们的地址是完全可用的。

(*)从技术上讲,数组本身可以被认为是一个指针(因此是地址),所以上面的术语有点不正确,但会帮助您更好地理解正在发生的事情。

其他人已经回答了如何使用映射来操作所需的double***,但在这种情况下,可能只需要double***的集合。typedef double*** Array3d可以帮助解决困惑。这样,定义在阵列上操作的函数就更清楚了:

typedef double*** Array3d;
//Operate on a single 3d array
void function( Array3d array )
{
  //Do something...  array[x][y][z] +-*/= whatever;
}
//Operate on a collection of 3d arrays.
void function2( Array3d arrays[] )
{
  for( unsigned int i = 0; i < ARRAY_SIZE; i++ )
  {
    //Do something per array... arrays[i][x][y][z] +-*/= whatever;
  }
}

如果可行的话,使用std::vector这样的标准容器将是一个更好的选择。

相关文章: