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正如多米所说(但不是
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所示)在创建方面较慢(并且需要更多的内存),但在访问方面更快。因为
您还可以创建一个类:
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]; |
1 | int (*array)[n] = (int (*)[n])new int[m *n]; |
这是因为您只能使用
可以使用一维数组模拟二维数组。索引转换为:
这也比在"重复"链接或其他答案中推荐的每行创建一个数组有更好的性能。
二维数组实际上是数组的数组,所以需要指针到指针。
首先,我建议你应该使用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]; } |