如何动态分配矩阵?

新手上路,请多包涵

如何在 C++ 中动态分配二维矩阵?我根据我已经知道的进行了尝试:

 #include <iostream>

int main(){
    int rows;
    int cols;
    int * arr;
    arr = new int[rows][cols];
 }

它适用于一个参数,但现在适用于两个。我应该怎么办?

原文由 chustar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 723
2 个回答

矩阵实际上可以表示为数组的数组。

 int rows = ..., cols = ...;
int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
    matrix[i] = new int[cols];

当然,要删除矩阵,您应该执行以下操作:

 for (int i = 0; i < rows; ++i)
    delete [] matrix[i];
delete [] matrix;


我刚刚想出了另一种可能性:

 int rows = ..., cols = ...;
int** matrix = new int*[rows];
if (rows)
{
    matrix[0] = new int[rows * cols];
    for (int i = 1; i < rows; ++i)
        matrix[i] = matrix[0] + i * cols;
}

释放这个数组更容易:

 if (rows) delete [] matrix[0];
delete [] matrix;

该解决方案的优点是为所有元素分配一个大块内存,而不是几个小块。不过,我发布的第一个解决方案是 数组 概念数组的更好示例。

原文由 pyon 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我知道在 C++ 中分配动态二维数组的最清晰直观的方法。此示例中的模板化涵盖了所有情况。

 template<typename T> T** matrixAllocate(int rows, int cols, T **M)
{
    M = new T*[rows];
    for (int i = 0; i < rows; i++){
        M[i] = new T[cols];
    }
    return M;
}

...

int main()
{
    ...
    int** M1 = matrixAllocate<int>(rows, cols, M1);
    double** M2 = matrixAllocate(rows, cols, M2);
    ...
}

原文由 KeyC0de 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏