C++ 动态数组分配及示例

什么是动态数组?

动态数组与常规数组非常相似,但其大小可以在程序运行时修改。动态数组元素占用连续的内存块。

一旦创建了数组,其大小就无法更改。然而,动态数组不同。动态数组即使在填满后也可以扩展其大小。

在创建数组时,它会分配预定的内存量。动态数组则不然,因为它在有需求时会按一定因子增长其内存大小。

影响动态数组性能的因素

数组的初始大小和增长因子决定了其性能。请注意以下几点:

  1. 如果数组大小和小增长因子,它会更频繁地重新分配内存。这将降低数组的性能。
  2. 如果数组大小大且增长因子大,它将会有大量未使用的内存。因此,调整大小操作可能需要更长时间。这将降低数组的性能。

new 关键字

在 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;
}

输出

The new Keyword

这是代码的屏幕截图:

The new Keyword

代码解释

  1. 将 iostream 头文件包含到我们的程序中以使用其函数
  2. 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
  3. 调用 main() 函数。程序逻辑应添加在函数体内部。
  4. 声明两个整数变量 x 和 n。
  5. 在控制台打印一些文本,提示用户输入变量 n 的值。
  6. 从键盘读取用户输入并将其分配给变量 n。
  7. 声明一个数组来容纳总共 n 个整数,并将其分配给指针变量 *arr。
  8. 打印一条消息,提示用户输入 n 个项。
  9. 使用 for 循环创建循环变量 x 来迭代用户输入的项。
  10. 读取用户输入的元素并将其存储在数组 arr 中。
  11. for 循环体结束。
  12. 在控制台打印一些文本。
  13. 使用 for 循环创建循环变量 x 来迭代数组的项。
  14. 在控制台上打印名为 arr 的数组中包含的值。
  15. for 循环体结束。
  16. 程序在成功完成后应返回值。
  17. main() 函数体结束。

注意:在上面的示例中,用户可以在运行时为数组指定任何大小。这意味着数组的大小是在运行时确定的。.

初始化动态分配的数组

将动态数组初始化为 0 非常容易。

语法

int *array{ new int[length]{} };

在上述语法中,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;
}

输出

Initializing dynamically allocated arrays

这是代码的屏幕截图:

Initializing dynamically allocated arrays

代码解释

  1. 将 iostream 头文件包含到我们的程序中以使用其函数。
  2. 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
  3. 调用 main() 函数。程序逻辑应添加在函数体内部。
  4. 声明一个名为 array 的整数变量。
  5. 使用初始化列表声明一个名为 array 的动态数组。该数组将包含 5 个整数元素。请注意,我们在数组长度和初始化列表之间没有使用“=”运算符。
  6. 在控制台打印一些文本。endl 是 C++ 关键字,表示换行。它会将光标移到下一句话。
  7. 使用 for 循环迭代数组元素。
  8. 在控制台上打印名为 array 的数组的内容。
  9. for 循环体结束。
  10. 程序在成功完成后应返回值。
  11. 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;
}

输出

Dynamically Deleting Arrays

这是代码的屏幕截图:

Dynamically Deleting Arrays

代码解释

  1. 将 iostream 头文件包含到我们的程序中,以便使用其函数。
  2. 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
  3. 调用 main() 函数。程序逻辑应添加在函数体内部。
  4. 声明两个整数数据类型的变量 x 和 n。
  5. 在控制台打印一些文本。文本将要求用户说明他们将输入的数字数量。
  6. 从键盘读取用户输入。输入值将分配给变量 n。
  7. 声明一个指针变量 *arr。数组 arr 将保留一些内存来存储总共 n 个整数。
  8. 在控制台打印一条消息,提示用户输入 n 个数字。
  9. 创建 for 循环和循环变量 x 来迭代用户输入的数字。
  10. 读取用户输入的数字并将其存储在数组 arr 中。
  11. for 循环体结束。
  12. 在控制台打印一些文本。
  13. 使用 for 循环和循环变量 x 来迭代数组 arr 的内容。
  14. 在控制台上打印数组 arr 的值。
  15. for 循环体结束。
  16. 在控制台上打印一个空行。
  17. 释放数组 arr 的内存。
  18. 程序将在成功完成后返回值。
  19. main() 函数体结束。

摘要

  • 常规数组的大小是固定的。声明后无法修改其大小。
  • 对于这些类型的数组,内存大小是在编译时确定的。
  • 动态数组则不同。它们的大小可以在运行时更改。
  • 在动态数组中,大小是在运行时确定的。
  • C++ 中的动态数组使用 new 关键字声明。
  • 我们使用方括号指定要存储在动态数组中的项数。
  • 完成数组后,我们可以使用 delete 运算符释放内存。
  • 使用带 [] 的 delete 运算符释放所有数组元素的内存。
  • 不带 [] 的 delete 只释放单个元素的内存。
  • C++ 数组没有内置的调整大小机制。
  • 要使用列表初始化器初始化数组,我们不使用“=”运算符。