如何在c ++中将多维数组传递给没有内部维度的函数?

时间:2015-10-29 21:55:20

标签: c++ arrays function multidimensional-array

我想知道是否有办法说明将此double MyArray[][2] = {{0.1,0.8},{0.4,0.6}}传递给类似void MyFunction(double myArray[][]);的函数,而不是说void MyFunction(double myArray[][2]);。我需要这个,因为我希望我的函数能够处理具有不同内部维度的数组,例如:double MyArray[][3] = {{0.1,0.8},{0.4,0.6},{0.3,0.9}}。据我所知,要将此函数传递给函数,我必须将MyFunctions的参数更改为MyFunction(myArray[][3]);。从我所看到的,我不知道这是否可能,所以如果不是,那么还有其他方法吗?

4 个答案:

答案 0 :(得分:4)

如果您可以将MyFunction更改为:

,则可以通过引用传递任意2d数组
template<std::size_t N, std::size_t M>
void MyFunction(double (&myArray)[N][M]) {
  // ...
}

这样你也可以拥有数组的维度。

答案 1 :(得分:0)

您可以使用模板:

template < size_t Dim >
void fun(double (*array)[Dim], size_t outerDim);

此时虽然我认真考虑使用std::arraystd::vector

答案 2 :(得分:0)

C ++有动态数组,它们被称为std::vector。您可以使用矢量矢量,例如

typedef std::vector<std::vector<double> > DMatrix;

并传递此类型的对象,就像使用任何其他对象一样,即

void foo(const DMatrix& matrix){
    for (int i=0;i<matrix.size();i++){
        for (int j=0;j<matrix.size();j++){
            std::cout << matrix[i][j] << std::endl;
        }
    }
} 

答案 3 :(得分:0)

这是一个非常常见的问题。

不幸的是,对于直接阵列,你应该这么做。

首先,在给定正确的索引和尺寸的情况下,您需要一个函数来索引您的多维数组的元素。对于2D数组:

VersatileLambda

注意缺少边界检查。您可以添加,如果您愿意,但您应该编写不需要它的代码。 (您的功能不应该需要它,并且内联帮助器功能将帮助您的用户不需要它。)

接下来,您的函数必须像在C中一样工作 - 获取展平(一维)数组的地址和尺寸。例如,这里我们将打印一个const 2D数组:

VersatileLambda

最后,您想要创建一些内联函数,转换为对通用函数的调用:

std::size_t index( std::size_t columns, std::size_t row, std::size_t column )
{
  return (row * columns) + column;
}

现在您可以将它与任何2D数组一起使用:

template <typename T>
void my_fn( const T* a, std::size_t rows, std::size_t columns )
{
  for (std::size_t r = 0; r < rows; r++)
  {
    for (std::size_t c = 0; c < columns; c++)
    {
      std::cout << a[ index( columns, r, c ) ] << " ";
    }
    std::cout << "\n";
  }
}

效率考虑:

  • 模板化函数的代码只应为每个类型生成一次; 相同类型的不同维度都将使用相同的函数。

  • 内联的thunk应该完全消失 - 由编译器优化。

  • 寻址元素并不比其他情况复杂,应该自动优化。

希望这有帮助。