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

Can't declare dynamic 2D array in C++

本问题已经有最佳答案,请猛点这里访问。

我遇到了一个问题——我不能用用户写的整数来声明C++中的2D数组。

这个代码很好用-

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

但我做不到-

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

有什么办法可以绕过它吗?p.s.错误:无法在分配中将"int()[2]"转换为"int"。


变化

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

2


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

1
2
3
4
5
6
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),所以你有一个乘法更少,但一个解引用更多,总之,我认为它更快。

您还可以创建一个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
    }
};

你可以用它

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


您可以这样做:

1
2
3
4
typedef int RowType[n];
RowType *array = new RowType[m];

doStuffWith(array[y][x]);

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

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

编辑:

C++中有一个catch,数组大小必须是EDCOX1的4Ω操作符的常数,所以只有当EDCOX1×7是EDCOX1×8Ω时,才能做到这一点。这不是C中的问题(也是我忘记这一点的原因),因此,即使n和m不是常量,也可以使用以下方法:

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

当然,您可以通过这样做来解决C++中的限制,即使EDCOX1 9和EDCX1 7都是动态的,也能起作用:

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

typedef免费版本为:

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


这是因为您只能使用new来分配1d数组。实际上,二维数组也是一维数组,在大多数系统中,所有行都简单地连接在一起。这被称为行主内存布局。

可以使用一维数组模拟二维数组。索引转换为:

index1 = y * m + x

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


arrayint *,您试图分配int **…将数组改为int**

二维数组实际上是数组的数组,所以需要指针到指针。


首先,我建议你应该使用STD::向量,以避免内存分配/解除分配问题。

如果需要数组实现,那么可以将数组声明为指向int的指针。

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