多维数组

时间:2012-01-17 21:36:20

标签: c++

我需要创建一个具有参数的函数,该参数是一个多维数组,其中两个维度是用户指定的,例如

int function(int a, int b, int array[a][b])
{
 ...
}

我如何在C ++中做到这一点?

3 个答案:

答案 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....
}

但是你的问题是你的函数只能带一个参数,所以:

  1. 如果维度在编译时已知,那么Fred's Answer是最好的(事实上它让我着迷!:)。
  2. 如果没有,我看不到任何可能的解决方案,允许传递多个用户指定的值,而不是将所有这些值封装在一个对象中。
  3. 像这样:

    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