我遇到了一个问题 - 我无法使用用户编写的整数在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 '。
答案 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)
array
为int *
,您尝试将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
运算符的数组大小必须保持不变,因此只有n
为const
时才能执行此操作。这不是C中的问题(也是我忘记这个的原因),所以即使n和m不是const,以下工作也是如此:
RowType *array = (RowType*)malloc(m * sizeof(RowType));
当然,您可以通过这样做来解决C ++中的这一限制,即使m
和n
都是动态的,这也有效:
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;