Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

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

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

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

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

При создании обычному массиву выделяется заранее заданное количество памяти. Динамический массив увеличивает свой размер по определённому фактору при необходимости.

В этом уроке вы узнаете:

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

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

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

Ключевое слово new

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

Синтаксис:

указатель = new тип[количество];

указатель — имя указательной переменной.

тип — любой допустимый тип C++.

Оператор new возвращает указатель на первый элемент. После использования динамический массив удаляется через 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;
}

Вывод:

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

Скриншот кода:

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

Разбор кода:

  1. Подключаем iostream для консольного ввода/вывода.
  2. Используем пространство имён std.
  3. Вызываем main().
  4. Объявляем целочисленные переменные x и n.
  5. Выводим приглашение ввести количество элементов.
  6. Считываем ввод пользователя в переменную n.
  7. Выделяем динамический массив на n целых чисел, сохраняем указатель в arr.
  8. Просим ввести n элементов.
  9. Цикл for для итерации по вводимым элементам.
  10. Считываем элементы в массив arr.
  11. Конец цикла.
  12. Выводим вводный текст.
  13. Цикл for для вывода элементов массива.
  14. Печатаем значения массива arr.
  15. Конец цикла.
  16. Программа возвращает значение при успешном завершении.
  17. Конец main().

ВАЖНО: В этом примере пользователь сам задаёт размер массива во время выполнения — размер определяется в runtime.

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

Легко инициализировать динамический массив нулями.

Синтаксис:

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

Здесь length — количество элементов. Поскольку инициализируем нулями, список инициализаторов оставляем пустым.

Можно инициализировать список инициализаторов. Пример:

Пример 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;
}

Вывод:

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

Скриншот кода:

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

Разбор кода:

  1. Подключаем iostream.
  2. Используем std.
  3. Вызываем main().
  4. Объявляем int x.
  5. Объявляем динамический массив array с инициализатором. Массив из 5 целых. Обратите внимание: оператор = между длиной и списком не используется.
  6. Выводим текст. endl — переход на новую строку.
  7. Цикл for по элементам массива.
  8. Печатаем содержимое массива.
  9. Конец цикла.
  10. Возврат 0 при успехе.
  11. Конец main().

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

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

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

Можно обойти это: выделить новый массив, скопировать элементы, удалить старый.

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

Удаление динамических массивов

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

Важно:

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

Пример 3: Использование delete[]

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

Вывод:

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

Скриншот кода:

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

Разбор кода:

  1. Подключаем iostream.
  2. Используем std.
  3. Вызываем main().
  4. Объявляем int x, n.
  5. Просим пользователя указать количество чисел.
  6. Считываем ввод в n.
  7. Выделяем массив на n целых через указатель arr.
  8. Просим ввести n чисел.
  9. Цикл for по вводимым числам.
  10. Считываем числа в массив arr.
  11. Конец цикла.
  12. Выводим текст.
  13. Цикл for по элементам массива.
  14. Печатаем значения массива.
  15. Конец цикла.
  16. Печатаем пустую строку.
  17. Освобождаем память массива arr через delete[].
  18. Возврат 0 при успехе.
  19. Конец main().

Резюме:

Язык C

  1. Массивы в C#: объявление, инициализация и операции
  2. Как передавать массивы в функции в C++: практическое руководство
  3. Динамическое выделение памяти в C: освоение malloc, calloc, realloc и free
  4. Массивы в C++: объявление, инициализация и работа с указателями
  5. Операторы в C++: типы, примеры и практические программы
  6. Оператор switch-case в C++: синтаксис, применение и практические примеры
  7. Структуры (struct) в C++: объяснение с практическим примером
  8. Освоение std::list в C++: синтаксис, функции и практические примеры
  9. C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
  10. Сортировка выбором в Java: пошаговый пример и полный код