对于矩阵和其他多维数组在 C 和 C+ 中的表示方式以及如何动态分配它们,我仍然不太了解。
考虑以下代码段:
int main()
{
int n;
cin >> n;
int a[n][n];
...
}
如果我没理解错的话,这会在堆栈上分配一个 n 乘 n 的整数矩阵。 可以使用 a[i][j] 访问矩阵的第 (i,j) 个元素。编译器 自动将其转换为对 a 的第 (n*i+j) 个元素的访问 实际分配的维数组。
现在假设我想在堆上分配 n×n 矩阵 a,而不是 的堆栈。然后我可以执行以下操作:
int main()
{
int n;
cin >> n;
int** a;
a = new int*[n];
for (int i=0;i<n;i++) a[i] = new int[n];
...
}
我现在可以再次访问第 (i,j) 个元素作为 a[i][j]。然而,这并不完全 相当于上面的情况,因为我实际上必须为 n*n int 分配空间, 加上 n 个指向 int 的指针。此外,访问 a[i][j] 现在需要两次访问内存 只有一个。另一方面,避免了索引计算n*i+j。
现在假设我对 n×m 矩阵感兴趣,其中 m 很小,例如 m=2。 使用行指针数组会浪费 33% 的空间。有什么办法 避免那个?
我当然可以分配一个一维数组并自己做索引运算, 但这对我来说似乎不是最好的解决方案。
如有任何信息,我们将不胜感激!
最佳答案
你可以做
int *mat = new int[n*n];
然后使用mat[n*i+j]
关于c++ - C++ 中的矩阵与数组的数组及其动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858649/