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

时间:2012-03-30 20:05:42

标签: c++ arrays multidimensional-array

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

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

我想做这样的事情:

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

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

4 个答案:

答案 0 :(得分:0)

您可以使用hash_map

myMap["a10"] = 5.0;

答案 1 :(得分:0)

试试这个:

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

double function (double* arrays[])
{
  ...
}

<强>解释

double* array[]声明一个指向双精度的指针数组。假设a1,...,a40是双精度数组,您可以使用它们初始化arrays数组(数组和指针有点同义)

然后在函数中你获取这个数组,并且可以引用每个元素,如arrays[0](相当于a1),...,arrays[39](相当于{ {1}})。

我注意到在函数的原始版本中a40,...,a1的类型中有指针间接的树级别。如果确实如此,您可以将上面的a40替换为double*。然而,这看起来非常可疑 - 正确处理这么多维度真的很难。

另外,我上面建议的是使用地址,而不是数组(*)的名称。名称仅供程序员使用,一旦编译程序,它们就不存在于可执行文件中,因此您无法通过名称引用它们。然而,他们的地址非常有用。

(*)从技术上讲,数组本身可以作为指针(因此地址),所以上面的术语稍微不正确,但会帮助你更好地理解发生了什么。

答案 2 :(得分: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);

但正如你所看到的那样,相当笨拙(****,哇!)。你可以解释一下你想要用你的代码围绕这么多三重指针来实现的目标吗?这让我头疼。

答案 3 :(得分:0)

其他人已经回答了如何使用地图来操作所需的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之类的标准容器将是更好的选择。