我想知道是否有办法说明将此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]);
。从我所看到的,我不知道这是否可能,所以如果不是,那么还有其他方法吗?
答案 0 :(得分:4)
如果您可以将MyFunction
更改为:
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::array
或std::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应该完全消失 - 由编译器优化。
寻址元素并不比其他情况复杂,应该自动优化。
希望这有帮助。