无法在C ++中声明动态2D数组

时间:2013-12-01 13:28:46

标签: c++ arrays dynamic multidimensional-array

我遇到了一个问题 - 我无法使用用户编写的整数在C ++中声明2D数组。

此代码工作正常 -

cin>>m>>n;
int *array;
array=new int[m*n];

但我无法做到这一点 -

cin>>m>>n;
int *array;
array=new int[m][n];

我有什么想法可以绕过它吗? 附:错误:无法在赋值时将'int()[2]'转换为'int '。

6 个答案:

答案 0 :(得分:2)

更改

cin>>m>>n;
int *array;
array=new int[m][n];

cin>>m>>n;
int **array;
array=new int * [m];

for ( int i = 0; i < m; i++ ) array[i] = new int[n];

答案 1 :(得分:0)

首先,我建议您使用std :: vector来避免内存分配/释放问题。

如果你想要一个数组实现,那么你可以将array声明为指向int的指针。

cin>>m>>n;
int **array = new *int[m];
for ( int I = 0; I < m; I++ ) {
  array[I] = new int[n];
}

答案 2 :(得分:0)

arrayint *,您尝试将int ** ...更改数组分配给int**

2D数组实际上是数组数组,因此需要指向指针的指针。

答案 3 :(得分:0)

那是因为你只能使用new来分配1D数组。实际上,2D阵列也是一维阵列,在大多数系统中,所有行都是简单连接的。这称为行主存储器布局。

您可以使用1D阵列模拟2D阵列。索引转换为:

index1 = y * m + x

这也比在“重复”链接或其他答案中建议的每行创建一个数组有更好的性能。

答案 4 :(得分:0)

你可以这样做:

typedef int RowType[n];
RowType *array = new RowType[m];

doStuffWith(array[y][x]);

或者,甚至更短(但更难记住):

int (*array)[n] = new (int[m][n]);

编辑:

C ++中有一个问题,即new运算符的数组大小必须保持不变,因此只有nconst时才能执行此操作。这不是C中的问题(也是我忘记这个的原因),所以即使n和m不是const,以下工作也是如此:

RowType *array = (RowType*)malloc(m * sizeof(RowType));

当然,您可以通过这样做来解决C ++中的这一限制,即使mn都是动态的,这也有效:

RowType *array = (RowType*)new int[m * n];

typedef免费版本就是这样:

int (*array)[n] = (int (*)[n])new int[m *n];

答案 5 :(得分:0)

正如Domi所说(但不是 index1=y*m+x而是index1=x*n+y来模仿您想要的符号):

int *array = new int [m*n];

int get (int x, int y) // emulates array[x][y] for array[m][n]
{
    return array[x*n+y];
}

然而,我认为真正的二维分配(如来自莫斯科的Vlad所示)在创建时速度较慢(并且需要更多内存),但访问速度更快。导致array[x*n+y] == *(array+x*n+y),更好array[x][y] == *(*(array+x)+y),所以你有一个乘法更少,但是一个解除更多,总和我认为它更快。

您还可以创建一个类:

class array2d
{
private:
    int *data;
    int mm, nn;
public:
    array2d (int m, int n)
    {
        mm = m;
        nn = n;
        data = new int [m*n];       
    }
    ~array2d ()
    {
        delete[] data;
    }
    int *operator[] (int x)
    {
        return (data+x*nn);
    }
};

有了它,你可以使用

array2d arr(10,10);
arr[5][7] = 1;