Динамическое распределение массивов в C++ на примере

Что такое динамический массив?

Динамический массив очень похож на обычный массив, но его размер можно изменить во время выполнения программы. Элементы DynamArray занимают непрерывный блок памяти.

После создания массива его размер нельзя изменить. Однако динамический массив отличается. Динамический массив может увеличивать свой размер даже после заполнения.

При создании массива ему выделяется заранее определенный объем памяти. Это не относится к динамическому массиву, поскольку при необходимости размер памяти увеличивается на определенный коэффициент.

Факторы, влияющие на производительность динамических массивов

Начальный размер массива и коэффициент его роста определяют его производительность. Обратите внимание на следующееwing точки:

  1. Если массив имеет небольшой размер и небольшой коэффициент роста, он будет чаще перераспределять память. Это снизит производительность массива.
  2. Если массив имеет большой размер и большой коэффициент роста, у него будет огромный кусок неиспользуемой памяти. Из-за этого операции изменения размера могут занять больше времени. Это снизит производительность массива.

Новое ключевое слово

В C++ мы можем создать динамический массив, используя ключевое слово new. Количество распределяемых элементов указывается в паре квадратов brackets. Имя типа должно предшествовать этому. Запрошенное количество предметов будет выделено.

Синтаксис

Новое ключевое слово принимает следующееwing синтаксис:

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

Вывод:

Новое ключевое слово

Вот скриншот кода:

Новое ключевое слово

Пояснение к коду:

  1. Включите заголовочный файл iostream в нашу программу, чтобы использовать его. Функции.
  2. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  3. Вызовите функцию main(). Логику программы следует добавлять в тело функции.
  4. Объявите две целочисленные переменные x и n.
  5. Выведите на консоль текст, предлагающий пользователю ввести значение переменной n.
  6. Прочитайте ввод пользователя с клавиатуры и присвойте его переменной n.
  7. Объявите массив для хранения n целых чисел и присвойте его переменной-указателю *arr.
  8. Распечатайте сообщение, предлагающее пользователю ввести n элементов.
  9. Используйте цикл for, чтобы создать переменную цикла x для перебора элементов, введенных пользователем.
  10. Чтение введенных пользователем элементов и сохранение их в массиве arr.
  11. Конец тела для цикла.
  12. Напечатайте текст на консоли.
  13. Используйте цикл for, чтобы создать переменную цикла x для перебора элементов массива.
  14. Выведите на консоль значения, содержащиеся в массиве с именем arr.
  15. Конец тела цикла for.
  16. Программа должна вернуть значение после успешного завершения.
  17. Конец тела функции 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;
}

Вывод:

Инициализация динамически выделяемых массивов

Вот скриншот кода:

Инициализация динамически выделяемых массивов

Пояснение к коду:

  1. Включите заголовочный файл iostream в нашу программу, чтобы использовать его функции.
  2. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  3. Вызовите функцию main(). Логику программы следует добавлять в тело функции.
  4. Объявите целочисленную переменную с именем x.
  5. Объявите динамический массив с именем array, используя список инициализаторов. Массив будет содержать 5 целочисленных элементов. Обратите внимание, что мы не использовали оператор «=» между длиной массива и списком инициализаторов.
  6. Напечатайте текст на консоли. Endl — это ключевое слово C++, означающее конечную строку. Он перемещает курсор к следующему предложению.
  7. Используйте цикл for для перебора элементов массива.
  8. Выведите содержимое массива с именем array на консоль.
  9. Конец тела цикла for.
  10. Программа должна вернуть значение после успешного завершения.
  11. Конец тела функции main().

Изменение размера массивов

Длина динамического массива устанавливается во время выделения.

Однако в C++ нет встроенного механизма изменения размера массива после его выделения.

Однако вы можете решить эту проблему, динамически выделив новый массив, скопировав элементы, а затем удалив старый массив.

Примечание: этот метод подвержен ошибкам, поэтому старайтесь его избегать.

Динамическое удаление массивов

Динамический массив должен быть удален из памяти компьютера, как только его цель будет достигнута. Оператор удаления может помочь вам в этом. Освободившееся пространство памяти затем можно использовать для хранения другого набора данных. Однако даже если вы не удалите динамический массив из памяти компьютера, он будет удален автоматически после завершения работы программы.

Примечание:

Чтобы удалить динамический массив из памяти компьютера, вместо delete следует использовать delete[]. [] указывает процессору удалить несколько переменных, а не одну переменную. Использование 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;
}

Вывод:

Динамическое удаление массивов

Вот скриншот кода:

Динамическое удаление массивов

Пояснение к коду:

  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. Освободите память массива обр.
  18. Программа вернет значение после успешного завершения.
  19. Конец тела функции main().

Итоги

  • Обычные массивы имеют фиксированный размер. Вы не можете изменить их размер после объявления.
  • Для этих типов массивов размер памяти определяется во время компиляции.
  • Динамические массивы разные. Их размеры могут быть изменены во время выполнения.
  • В динамических массивах размер определяется во время выполнения.
  • Динамические массивы в C++ объявляются с использованием ключевого слова new.
  • Мы используем квадрат brackets чтобы указать количество элементов, которые будут храниться в динамическом массиве.
  • Закончив работу с массивом, мы можем освободить память с помощью оператора удаления.
  • Используйте оператор удаления с [], чтобы освободить память всех элементов массива.
  • Удаление без [] освобождает память только для одного элемента.
  • В C++ нет встроенного механизма изменения размера массивов.
  • Чтобы инициализировать массив с помощью инициализатора списка, мы не используем оператор «=".