c++ - C++ 中的矩阵与数组的数组及其动态分配

标签 c++ matrix allocation

对于矩阵和其他多维数组在 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/

相关文章:

c - 使用 malloc 分配结构数组

linux - 在 shell 脚本中为 Linux 命令分配 CPU 和内存

c++ - 无法确定我的递归出错的位置 (c++)

c++ - 虚函数和泛型编程

c++ - 如何识别 vector 迭代器是否已到达 vector 末尾?

matlab - Matlab 中大型非稀疏矩阵的高效运算

求矩阵转置的Python代码

javascript - CSS矩阵计算

c++ - 时间戳 DFS

c - 在 C 中多次正确返回一个字符串