动态数组

2024年8月28日 | 阅读 8 分钟

动态数组与普通数组类似。动态数组可以修改,但区别在于程序运行时。动态数组的元素占用连续的内存块

一旦数组的创建开始,动态数组的大小就无法更改。所以动态数组与众不同。即使动态数组已经填满,其大小也可以扩展。

在创建数组时会分配预定的内存量。随着动态数组的扩展,其内存大小可能取决于各种因素,所以,如果不是动态数组,则应排除这种情况。

影响动态数组性能的各种因素

数组的性能由其增长因子和初始大小决定。影响性能的因素如下

  • 如果数组中的增长因子和大小都很小,那么内存重新分配会更频繁。此因素会降低数组的性能。
  • 考虑到另一个因素,如果增长因子和数组大小都很大,那么数组会占用大量未使用的内存。由于此因素,调整大小的操作可能需要更长的时间,因此数组的性能可能会降低。

new 关键字

C++ 中,使用 new 关键字可以分配动态数组。在方括号对内,指定要分配的项目的必需数量。类型名称应置于此关键字之前。将分配请求的项目数量。

语法

new 关键字的语法如下

语法描述

pointer_var 代表指针变量的名称。

根据以上语法,写入的数据类型应为有效的 C++ 数据类型。

之后,关键字将返回第一个指针。然后在创建动态数组后,可以使用 delete 关键字从语句中删除它。

动态数组分配的一些示例

示例:1

输出

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

以上示例代码说明

  1. 首先,在我们的程序中,我们将包含 iostream 头文件 以使用其函数。
  2. 然后,在我们的程序中,我们将包含 std 命名空间,而无需调用它,以便使用其类。
  3. 之后,我们将调用 main 函数。在函数体中,应添加程序逻辑。
  4. 然后我们声明了两个变量,如 p 和 q,类型为整数。
  5. 然后,为了输入 变量 q 的值,我们必须提示用户在控制台上打印一些文本。
  6. 之后,将从键盘读取用户输入的值,并将其分配给 变量 q
  7. 为了保存 q 个整数 的总数并将其分配给指针变量 *arr,您必须为其声明一个数组。
  8. 为了输入 q 个项目,我们必须向用户打印一条消息。
  9. 然后,将为 变量 P 创建一个循环,以迭代用户输入的项目。
  10. 用户输入的元素将被读取并存储在此 数组 arr 中。
  11. 然后循环体将结束。
  12. 之后,将在控制台上打印一些文本。
  13. 之后,我们将使用 for 循环 来创建一个循环变量 P,以迭代数组的项目。
  14. 然后,将把名为 arr 的数组中包含的值打印到控制台上。
  15. 然后 for 循环 的主体将结束。
  16. 程序成功完成后,应 返回 该值。
  17. 最后,主函数体将结束。

在上面的示例中,用户可以在程序运行时指定数组所需的任何大小。因此,我们可以从中了解到,数组的大小可以在分配时确定。

已分配动态数组的初始化

将数组初始化为 0 是一个简单的过程。

分配的语法

上述语法的描述

上述语法显示了要添加到数组的长度中的元素数量。

此位置应为空,因为数组将被初始化为 0。借助初始化列表,我们可以初始化动态数组。现在,我们将创建一个演示此数组的示例。

示例

输出

Entered Array elements are:
9
6
12
2
13

上述代码说明

  1. 首先,在我们的程序中,我们将包含 iostream 头文件 以使用其函数。
  2. 然后,在我们的程序中,我们将包含 std 命名空间,而无需调用它,以便使用其类。
  3. 之后,我们将调用 main。在函数体中,应添加程序逻辑。
  4. 然后我们声明了一个变量,如整数类型的 p
  5. 借助初始化列表,我们将声明一个名为 array 的数组。该数组可以容纳 5 个整数。重要的是,在初始化列表和数组长度之间,= 运算符 没有被使用。
  6. 将打印一些文本。C++ 中 endl 关键字的含义是行结束。此关键字将光标移至下一行。
  7. 将使用 for 循环 迭代 数组元素。
  8. 将把名为 array 的数组的内容打印到控制台上。
  9. 这里 for 循环的主体将结束。
  10. 因此,程序成功完成后,它应该返回其值。
  11. 最后,这里将结束 main 函数。

数组重排

在分配时,会设置动态数组的长度。一旦分配,C++ 内部就没有用于调整数组大小的内置函数。

通过分配新数组,复制元素然后删除旧数组,我们可以克服这个挑战。在此过程中,可能会发生许多错误,因此我们必须意识到这一点。

动态删除数组

一旦数组的目的在计算机内存中完成,就应该删除动态数组。为此操作,delete 语句有助于完成。数组删除后释放的内存空间可用于存储另一组数据。但是,一旦程序终止,即使我们不使用数组,动态分配的数组也会自动删除。

一些要点

而不是使用 delete,我们必须使用 delete[] 来从计算机内存中删除动态数组。与其删除一个变量,不如让 CPU 删除多个 变量 []。但是,在处理动态数组时,如果使用 delete 而不是 delete[],可能会出现问题。

数据损坏、内存泄漏、崩溃等是此问题的例子。

示例

输出

Amount of numbers that you will type
3
Type these 3 required numbers
1 2 3
The typed number as follows: 1 2 3

以上示例代码说明

  1. 首先,在我们的程序中,我们将包含 iostream 头文件 以使用其函数。
  2. 然后,在我们的程序中,我们将包含 std 命名空间,而无需调用它,以便使用其类。
  3. 之后,我们将调用 main 函数。在函数体中,应添加程序逻辑。
  4. 然后我们声明了两个变量,如 p 和 q,类型为整数。
  5. 然后,为了输入 变量 q 的值,我们必须提示用户在控制台上打印一些文本。
  6. 之后,将从键盘读取用户输入的值,并将其分配给 变量 q
  7. 为了保存 q 个整数 的总数并将其分配给指针变量 *arr,您必须为其声明一个数组。
  8. 为了输入 q 个项目,我们必须向用户打印一条消息。
  9. 然后将为 变量 P 创建 for 循环,以迭代用户输入的项目。
  10. 用户输入的元素将被读取并存储在此数组 arr 中。
  11. 然后 for 循环 主体将结束。
  12. 之后,将在控制台上打印一些文本。
  13. 之后,我们将使用 for 循环 创建一个循环变量 P 来迭代数组的项目。
  14. 然后,将把名为 arr 的数组中包含的值打印到控制台上。
  15. 然后 for 循环 的主体将结束。
  16. 之后,将在控制台上打印一个空行。
  17. 数组 arr 的内存将被释放。
  18. 当程序成功完成后,程序将返回值。
  19. 最后,main 函数将结束。

总结

在上面的上下文中,我们已将这些要点总结如下

  • 常规大小的数组具有固定大小。一旦声明了常规大小的数组,我们就无法更改它们的大小。
  • 在编译时,使用这些类型的数组来确定内存的大小。
  • 但是,除此之外,动态数组的类型完全不同。在运行时,可以更改此数组的大小。
  • 使用 C++ 中的 new 关键字,我们可以声明 动态数组
  • 为了指定项目数量,我们使用方括号来存储在动态数组中。
  • 完成后,我们可以使用 delete 运算符来释放内存。
  • 对于所有数组元素,我们使用 delete 运算符以及 [] 来释放内存。
  • 对于 C++ 数组的重排,没有内置的数组机制。