我需要创建一个具有参数的函数,该参数是一个多维数组,其中两个维度是用户指定的,例如
int function(int a, int b, int array[a][b])
{
...
}
我如何在C ++中做到这一点?
答案 0 :(得分:2)
在编译时是否知道维度?在这种情况下,将它们转换为模板参数并通过引用传递数组:
template<int a, int b>
int function(int(&array)[a][b])
{
...
}
示例客户端代码:
int x[3][7];
function(x);
int y[6][2];
function(y);
答案 1 :(得分:1)
假设在编译时未知维度,您模拟具有一维数组的二维数组:
int& getat(int x, int y, int r, int c, int *array) {return array[y*c+x];}
int function(int a, int b, int *array) {
getat(4, 2, a, b, array) = 32; //array[4,2] = 32
}
或者,为了安全起见,将其全部包装在一个类中:
template <class T>
class array2d {
std::vector<T> data;
unsigned cols, rows;
public:
array2d() : data(), cols(0), rows(0) {}
array2d(unsigned c, unsigned r) : data(c*r), cols(c), rows(r) {}
T& operator()(unsigned c, unsigned r) {
assert(c<cols&&r<rows);
return data[r*cols+c];
}
};
或者,最好还是使用Boost's Multidimensional Array,这比凡人所写的更好。
答案 2 :(得分:0)
我不确定这是否有效,因为你的问题和代码不一样,根据你的代码,该函数可以有3个参数,所以这样可以工作:
int function(int a, int b, int** &array)
{
array = new int*[a];
for (int i =0;i<a;i++)
array[i] = new int[b];
// I don't know why you are returning int, probably doing something here....
}
但是你的问题是你的函数只能带一个参数,所以:
像这样:
class Foo {
public:
Foo(int d1, int d2)
{ a = d1; b = d2; }
int a,b;
int** array;
};
int function(Foo &f)
{
f.array = new int*[f.a];
for (int i = 0;i<f.a;i++)
f.array[i] = new int[f.b];
// I don't know why you are returning int, probably doing something here....
}
虽然我发现这是一个坏主意,但事实上function
可能是一个无参数的方法:
class Foo {
public:
Foo(int d1, int d2)
{ a = d1; b = d2; }
void Create() // Or could do this right in the Constructor
{
array = new int*[a];
for (int i = 0;i<a;i++)
array[i] = new int[b];
}
private:
int a,b;
int** array;
};
这仍然是一个坏主意,因为你正在重新发明轮子,因为STL中有一个完美的课程可以为你完成所有的工作:
vector< vector<int> > v; // Now v is a 2D array