我正在解决一个关于子矩阵和的问题,我将我的 2d 数组声明为
int a[i][j] ; //i =number of rows and j = number of columns
我的代码正确执行。但是当我看到解决方案 我看到了这些行:
int **arr = new int * [n] ;
for (int i = 0 ; i < n ; i++)
{
arr[i]=new int [m];
}
// n -> number of rows and m -> number of columns.
我理解代码。 为什么解决方案(在一些随机网站上给出(是使用指针。如果我们可以使用上述正常声明来做到这一点。它会让代码更快还是什么?
此声明
int a[i][j] ; //i =number of rows and j = number of columns
要求变量i
和j
是编译时常量。可变长度数组不是标准的 C++n 功能,尽管某些编译器可以有自己的语言扩展来包含此功能。
存在的第二个问题是,如果数组的大小太大,则编译器可能无法创建具有自动存储持续时间的此类数组。
因此,如果i
和j
不是编译时常量或太大,那么您必须自己动态分配内存,或者您可以使用标准容器std::vector
。
如果我们可以使用上面的正常声明来做到这一点。它会让代码更快还是什么? 否 在上面的代码中,您在堆栈中创建一个数组,如果函数超出范围,它将被自动删除
第二个是在堆中创建的,它将仍在堆中,直到您自行删除它
数组声明的两种方式在不同的用例中都很有用。宣言:
int a[i][j];
静态声明一个数组,它使用堆栈内存来存储数组,或者我们可以说内存是在运行时分配的。这种类型的数组声明要求您传递值"n",并且在声明数组后无法更改数组的大小。这就是它有一个缺点的地方,因为如果您想存储更多元素,则无法增加大小。此外,如果您存储的元素少于"n",则剩余的内存将被浪费。 另一种类型的声明:
int *a = new int[n]; //For 1D array
创建动态分配的内存。换句话说,在这种类型的声明中,内存分配仅在元素放置在数组中或运行时时发生。 此分配可确保没有内存浪费,并将数组的元素存储在堆内存中。但是在这种类型的声明中,您还需要释放内存,否则可能会导致内存泄漏,因为C++没有垃圾收集器之类的东西。