different between int **arr =new int [ n]; and int a[i][j]?



我正在解决一个关于子矩阵和的问题,我将我的 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

要求变量ij是编译时常量。可变长度数组不是标准的 C++n 功能,尽管某些编译器可以有自己的语言扩展来包含此功能。

存在的第二个问题是,如果数组的大小太大,则编译器可能无法创建具有自动存储持续时间的此类数组。

因此,如果ij不是编译时常量或太大,那么您必须自己动态分配内存,或者您可以使用标准容器std::vector

如果我们可以使用上面的正常声明来做到这一点。它会让代码更快还是什么? 否 在上面的代码中,您在堆栈中创建一个数组,如果函数超出范围,它将被自动删除

第二个是在堆中创建的,它将仍在堆中,直到您自行删除它

数组声明的两种方式在不同的用例中都很有用。宣言:

int a[i][j];

静态声明一个数组,它使用堆栈内存来存储数组,或者我们可以说内存是在运行时分配的。这种类型的数组声明要求您传递值"n",并且在声明数组后无法更改数组的大小。这就是它有一个缺点的地方,因为如果您想存储更多元素,则无法增加大小。此外,如果您存储的元素少于"n",则剩余的内存将被浪费。 另一种类型的声明:

int *a = new int[n];                      //For 1D array

创建动态分配的内存。换句话说,在这种类型的声明中,内存分配仅在元素放置在数组中或运行时时发生。 此分配可确保没有内存浪费,并将数组的元素存储在堆内存中。但是在这种类型的声明中,您还需要释放内存,否则可能会导致内存泄漏,因为C++没有垃圾收集器之类的东西。

相关内容

最新更新