C++ 动态数组
动态数组 类似于常规数组。动态数组可以在程序运行时进行修改,但唯一的区别是,动态数组元素占据了一块连续的内存块。
动态数组的大小一旦开始创建数组就不能更改。因此,动态数组与其他数组在某种程度上是不同的。即使动态数组被填满,其大小也可以扩展。
在创建数组时会分配预定数量的内存。随着动态数组的扩展,其内存大小在需求发生时可能有各种因素,因此这种情况并非适用于动态数组。
影响动态数组性能的各种因素:
数组的性能取决于其增长因子和起始大小。影响性能的因素如下:
- 如果数组的增长因子和大小都很小,则重新分配内存的次数会更多。这会降低数组的性能。
- 另一个因素是,如果数组的增长因子和大小都很大,则数组会存在大量未使用的内存块。由于这个因素,调整大小操作可能需要更长的时间,从而降低数组的性能。
new关键字
在C++中,使用new关键字可以为动态数组分配内存。需要指定要分配的项目数,在一对方括号中指定。此关键字之前应该是类型名。将分配请求的项目数。
语法:
new关键字的语法如下:
Pointer_var = new data_type;
语法描述:
pointer_var 是指针变量的名称。
根据上述语法,写入的数据类型应为有效的C++数据类型。
其后,关键字将返回一个指针的第一个项目。然后在创建动态数组后,可以使用delete关键字从语句中删除它。
动态数组分配的一些示例:
示例
#include
using namespace std;
int main() {
int p, q;
cout << "enter the number of items that you want to store:" << "\n";
cin >>q;
int *arr = new int(q);
cout << "enter the " << q << " items that you want to store:" << endl;
for (p = 0; p < q; p++) {
cin >> arr[p];
}
cout << "you entered the following things: ";
for (p = 0; p < q; p++) {
cout << arr[p] << " ";
}
return 0;
}
输出:
Enter the number of items that you want to store:
2
Enter the 2 items that you want to store:
10 11
You entered the following things: 10 11
上述示例代码的解释:
- 首先,在我们的程序中,我们将包含头文件以使用其函数。
- 然后,在我们的程序中,我们将包含std命名空间,而不调用它以使用其类。
- 之后,我们将调用main函数。在函数体内,应该添加程序的逻辑。
- 然后我们声明了两个整数类型的变量,如p和q。
- 然后,为了输入变量q的值,我们必须提示用户在控制台上打印一些文本。
- 之后,用户从键盘输入的值将被读取,并将此值分配给变量q。
- 为了保留q的整数总数并将其赋值给指针变量*arr,您必须为其声明一个数组。
- 为了输入队列项的数量,我们必须为用户打印一条消息。
- 然后,将为变量P创建一个循环来迭代用户输入的项。
- 用户输入的元素将被读取并存储在名为arr的数组中。
- 然后将结束循环的主体。
- 之后,在控制台上将打印一些文本。
- 之后,我们将使用for循环创建一个循环变量P来迭代数组的项。
- 然后,将在控制台上打印数组arr中包含的值。
- 然后结束for循环的主体。
- 成功完成程序后,应该返回值。
- 最后,将结束主函数的主体。
在上面的示例中,用户可以在运行时指定数组的任何所需大小。因此,我们可以理解数组的大小可以在分配时确定。
动态分配数组的初始化
将数组初始化为0是一个简单的过程。
分配的语法如下:
Int *array{ new int[length]{} };
以上语法的描述
以上语法显示了要添加到数组中的长度的元素数量。
该位置应该为空,因为数组将初始化为 0 。通过初始化器列表,我们可以初始化一个动态数组。现在,我们将创建一个示例来演示这个数组。
示例
#include
Using namespace std;
Int main(void) {
Int p;
Int *array{ new int[5]{ 9, 6, 12, 2, 13 } };
Cout << "entered Array elements are: "<< endl;
For (p = 0; p < 5; p++) {
Cout << array[p] << endl;
}
Return 0;
}
输出:
Entered Array elements are:
9
6
12
2
13
以上代码的说明:
- 首先,在程序中,我们会包含 iostream头文件 以使用它的函数。
- 然后,在程序中,我们会包含 std命名空间 而不是调用它,以便使用它的类。
- 之后,我们将调用 main函数 在函数体中,应该添加程序的逻辑。
- 然后我们声明一个变量,例如 p 的整数类型。
- 借助初始化列表,我们将声明一个名为array的数组。 可以容纳5个整数 在数组长度和初始化列表之间的重要点是没有使用 =运算符 。
- 将输出一些文本。在C++中,endl关键字表示一行的结束。光标在该关键字后移至下一句。
将使用for循环 迭代 数组元素。
将在控制台上打印数组array的内容。
for循环的主体在此结束。
所以,完成程序后,应返回其值。
最后,这里会结束main函数。
数组的重新分配大小
在分配期间,设置动态数组的长度。一旦已分配,C++中没有内置函数可以重新调整数组的大小。
通过分配新数组并复制元素来擦除旧数组,我们可以解决这个问题。在此过程中,可能会发生许多错误,因此我们必须注意。
动态删除数组
一旦计算机内存中的数组的目的完成,就应删除动态数组。为此,可以使用delete语句来完成。删除数组后释放的内存空间可以用来存储另一组数据。但是,一旦程序终止,即使不使用数组,动态分配的数组也可以自动删除,从计算机内存中。
一些重要的点
我们必须使用 delete[] 而不是delete来从计算机内存中删除动态数组。而不是删除一个变量来删除多个 变量[] 指示CPU完成。但是,在处理动态数组时,如果我们使用delete来替代 delete[] 可能会导致问题。
数据损坏,内存泄漏,崩溃等都是这个问题的示例。
示例:
#include
using namespace std;
int main() {
int p, q;
cout << "amount of number that you will type" << "\n";
cin >>q;
int *arr = new int(q);
cout << "type these " << q << " required numbers" << endl;
for (p = 0; p < q; p++) {
cin >> arr[p];
}
cout << "the typed number as follows: ";
for (p = 0; p < q; p++) {
cout << arr[p] << " ";
}
cout << endl;
delete [] arr;
return 0;
}
输出:
Amount of numbers that you will type
3
Type these 3 required numbers
1 2 3
The typed number as follows: 1 2 3
上面示例代码的解释:
- 首先,在我们的程序中,我们将包含 iostream头文件 以便使用它的函数。
- 然后,在我们的程序中,我们将包含 std命名空间 而不调用它以便使用它的类。
- 接下来,我们将调用 main函数 。在函数体内,应添加程序的逻辑。
- 然后,我们声明两个整数类型的变量, p 和 q 。
- 然后,为了输入 变量 q 的值,我们必须提示用户在控制台上打印一些文本。
- 然后,用户从键盘输入的内容将被接受,并将此值分配给 变量 q 。
- 要保持 q个整数 的总数,并将其分配给指针变量 *arr ,必须声明一个数组。
- 要输入q个项目,我们必须为用户打印一条消息。
- 然后,将创建一个 for循环 ,以便遍历用户输入的项目。
- 用户输入的元素将被读取,并存储在数组arr中。
- 然后,将结束 for循环 体。
- 接下来,在控制台上会打印一些文本。
- 然后,我们将使用 for循环 来创建一个循环变量P,以便遍历数组的项目。
- 然后,将打印数组arr中包含的值。
- 然后,将结束 for循环 的主体。
- 接下来,会在控制台上打印一个空行。
- 将释放数组 arr 的内存。
- 当程序成功完成时,程序将返回该值。
- 最后,将结束main函数。
总结
在上面的上下文中,我们将这些要点总结如下:
- 有一个 固定大小 的 常规大小的数组 。一旦声明了常规大小的数组,就不能更改其大小。
- 在编译时期,这些类型的数组会确定内存的大小。
- 但是除此之外,动态数组的类型完全不同。在运行时,可以更改该数组的大小。
- 在C++中,使用 new 关键字 可以声明 动态数组 。
- 为了指定项的数量,我们使用方括号来存储在动态数组中。
- 在完成后,我们可以借助 delete 运算符释放内存。
- 对于所有数组元素,我们使用 delete 运算符以及 [] 释放内存。
- 对于C++数组的调整大小,没有内置的数组机制。