C++ 数组的动态分配示例
什么是动态数组?
动态数组与常规数组非常相似,但其大小可在程序运行时修改。DynamArray 元素占用连续的内存块。
一旦创建了数组,其大小就无法更改。但是,动态数组则不同。动态数组即使在填满后也可以扩展其大小。
在创建数组时,会为其分配预定数量的内存。动态数组则不会这样,因为当有需要时,它会按一定倍数增加其内存大小。
影响动态数组性能的因素
数组的初始大小及其增长因子决定了其性能。请注意以下几点:
- 如果数组的大小和增长因子都较小,它将更频繁地重新分配内存。这会降低数组的性能。
- 如果数组的大小很大,并且增长因子很大,那么它将有大量未使用的内存。 因此,调整大小操作可能需要更长时间。 这会降低数组的性能。
new 关键字
In C++,我们可以使用 new 关键字创建一个动态数组。要分配的项目数在一对方括号内指定。类型名称应位于其前面。将分配请求的项目数。
句法
new 关键字采用以下语法:
pointer_variable = new data_type;
pointer_variable 是 指针变量.
data_type 必须是有效的 C++ 数据类型。
然后,该关键字返回指向第一个项的指针。创建动态数组后,我们可以使用 delete 关键字将其删除。
例如1:
#include<iostream> using namespace std; int main() { int x, n; cout << "Enter the number of items:" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " items" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You entered: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } return 0; }
输出:
以下是代码截图:
代码说明:
- 将 iostream 头文件包含到我们的程序中以使用它 功能.
- 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
- 调用 main() 函数。程序逻辑应添加在函数主体内。
- 声明两个整数变量 x 和 n。
- 在控制台上打印一些文本,提示用户输入变量 n 的值。
- 从键盘读取用户输入并将其分配给变量 n。
- 声明一个数组来保存总共n个整数并将其分配给指针变量*arr。
- 打印一条消息提示用户输入 n 个项目。
- 使用 for 循环创建循环变量 x 来迭代用户输入的项目。
- 读取用户输入的元素并将其存储在数组arr中。
- 主体的结尾 for循环.
- 在控制台上打印一些文本。
- 使用 for 循环创建循环变量 x 来迭代数组的各个项目。
- 在控制台上打印出名为 arr 的数组中包含的值。
- for 循环主体的结束。
- 程序成功完成后必须返回值。
- main() 函数体结束。
注意:在上面的例子中,用户可以在运行时指定数组的任意大小。这意味着数组的大小是在运行时确定的.
初始化动态分配的数组
将动态数组初始化为 0 很容易。
语法:
int *array{ new int[length]{} };
在上面的语法中,长度表示要添加到数组中的元素数量。由于我们需要将数组初始化为 0,因此应将其留空。
我们可以使用初始化列表来初始化动态数组。让我们创建一个示例来演示这一点。
例如2:
#include <iostream> using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << "Array elements: " << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; }
输出:
以下是代码截图:
代码说明:
- 将iostream头文件包含到我们的程序中以使用其功能。
- 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
- 调用 main() 函数。程序逻辑应添加在函数主体内。
- 声明一个名为 x 的整型变量。
- 使用初始化列表声明一个名为 array 的动态数组。该数组将包含 5 个整数元素。请注意,我们没有在数组长度和初始化列表之间使用“=”运算符。
- 在控制台上打印一些文本。endl 是 C++ 表示结束行的关键字。它将光标移动到下一个句子。
- 使用 for 循环遍历数组元素。
- 在控制台上打印名为array的数组的内容。
- for 循环主体的结束。
- 程序成功完成后必须返回值。
- main() 函数体结束。
调整数组大小
动态数组的长度在分配时设置。
然而, C++ 一旦分配了数组,就没有内置的调整数组大小的机制。
但是,您可以通过动态分配新数组、复制元素,然后删除旧数组来克服这一难题。
注意:此技术容易出错,因此请尽量避免它。
动态删除数组
一旦动态数组的用途实现,就应该将其从计算机内存中删除。delete 语句可以帮助您实现这一点。释放的内存空间可用于保存另一组数据。但是,即使您不从计算机内存中删除动态数组,程序终止后也会自动将其删除。
请注意:
要从计算机内存中删除动态数组,应使用 delete[],而不是 delete。[] 指示 CPU 删除多个变量,而不是一个变量。处理动态数组时使用 delete 而不是 delete[] 可能会导致问题。此类问题的示例包括内存泄漏、数据损坏、崩溃等。
例如3:
#include<iostream> using namespace std; int main() { int x, n; cout << "How many numbers will you type?" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " numbers" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You typed: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } cout << endl; delete [] arr; return 0; }
输出:
以下是代码截图:
代码说明:
- 在我们的程序中包含iostream头文件以便使用它的功能。
- 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
- 调用 main() 函数。程序逻辑应添加在函数主体内。
- 声明两个整数数据类型的变量 x 和 n。
- 在控制台上打印一些文本。文本将要求用户说明他们将输入的数字数量。
- 从键盘读取用户输入。输入值将被赋给变量 n。
- 声明一个指针变量*arr。数组arr将保留一些内存来存储总共n个整数。
- 在控制台上打印一条消息,提示用户输入 n 个数字。
- 创建一个 for 循环和循环变量 x 来迭代用户输入的数字。
- 读取用户输入的数字并将其存储在数组arr中。
- for 循环主体的结束。
- 在控制台上打印一些文本。
- 使用 for 循环和循环变量 x 来迭代数组 arr 的内容。
- 在控制台上打印出数组 arr 的值。
- for 循环主体的结束。
- 在控制台上打印一个空行。
- 释放数组arr的内存。
- 程序成功完成后将返回值。
- main() 函数体结束。
结语
- 常规数组具有固定大小。声明后就无法修改其大小。
- 对于这些类型的数组,内存大小是在编译时确定的。
- 动态数组则不同。它们的大小可以在运行时改变。
- 在动态数组中,大小是在运行时确定的。
- 动态数组 C++ 使用 new 关键字声明。
- 我们使用方括号来指定要存储在动态数组中的项目数。
- 一旦完成数组,我们可以使用 delete 运算符释放内存。
- 使用带有 [] 的删除运算符释放所有数组元素的内存。
- 不带 [] 的删除只会释放单个元素的内存。
- 没有内置调整大小的机制 C++ 数组。
- 要使用列表初始化器初始化数组,我们不使用“=”运算符。