C++ Динамічне розміщення масивів із прикладом
Що таке динамічний масив?
Динамічний масив дуже схожий на звичайний масив, але його розмір можна змінювати під час виконання програми. Елементи DynamArray займають безперервний блок пам'яті.
Після створення масиву його розмір не можна змінити. Однак динамічний масив є іншим. Динамічний масив може розширювати свій розмір навіть після заповнення.
Під час створення масиву йому виділяється заздалегідь визначений обсяг пам'яті. Це не стосується динамічного масиву, оскільки він збільшує розмір пам’яті на певний коефіцієнт, коли є потреба.
Фактори, що впливають на продуктивність динамічних масивів
Початковий розмір масиву та його коефіцієнт зростання визначають його продуктивність. Зверніть увагу на такі моменти:
- Якщо масив має невеликий розмір і малий фактор зростання, він буде продовжувати перерозподіл пам'яті частіше. Це знизить продуктивність масиву.
- Якщо масив має великий розмір і великий коефіцієнт зростання, він матиме величезну частину невикористаної пам’яті. Через це операції зміни розміру можуть тривати довше. Це знизить продуктивність масиву.
Нове ключове слово
In C++, ми можемо створити динамічний масив за допомогою нового ключового слова. Кількість елементів, які потрібно виділити, вказується в парі квадратних дужок. Назва типу має передувати цьому. Запитану кількість предметів буде виділено.
синтаксис
Ключове слово new має такий синтаксис:
pointer_variable = new data_type;
Змінна_покажчика є назвою змінна вказівника.
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, щоб створити змінну циклу 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 - це a C++ ключове слово, що означає кінцевий рядок. Він переміщує курсор до наступного речення.
- Використовуйте цикл for для перебору елементів масиву.
- Вивести на консоль вміст масиву з назвою array.
- Кінець тіла циклу for.
- Після успішного завершення програма повинна повернути значення.
- Кінець тіла функції main().
Зміна розміру масивів
Довжина динамічного масиву встановлюється протягом часу виділення.
Тим не менш, C++ не має вбудованого механізму зміни розміру масиву після його виділення.
Однак ви можете подолати цю проблему, динамічно виділивши новий масив, скопіювавши елементи, а потім стираючи старий масив.
Зверніть увагу: ця методика схильна до помилок, тому намагайтеся її уникати.
Динамічне видалення масивів
Динамічний масив слід видалити з пам'яті комп'ютера, коли його призначення буде виконано. Інструкція delete може допомогти вам у цьому. Потім звільнений простір пам’яті можна використовувати для зберігання іншого набору даних. Однак, навіть якщо ви не видалите динамічний масив із пам’яті комп’ютера, він буде видалений автоматично після завершення програми.
Примітка:
Для видалення динамічного масиву з пам'яті комп'ютера слід використовувати 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; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка iostream у нашу програму, щоб використовувати його функції.
- Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
- Виклик функції main(). Логіку програми слід додати в тіло функції.
- Оголосити дві змінні x і n цілочисельного типу даних.
- Надрукуйте текст на консолі. У тексті користувачеві буде запропоновано вказати кількість цифр, які він введе.
- Читання введених користувачем даних з клавіатури. Вхідне значення буде присвоєно змінній n.
- Оголошення змінної покажчика *arr. Масив arr зарезервує деяку пам’ять для зберігання всього n цілих чисел.
- Вивести на консоль повідомлення із проханням ввести n чисел.
- Створіть цикл for і змінну циклу x, щоб перебирати числа, введені користувачем.
- Читання введених користувачем чисел і збереження їх у масиві arr.
- Кінець тіла циклу for.
- Надрукуйте текст на консолі.
- Використовуйте цикл for і змінну циклу x, щоб перебирати вміст масиву arr.
- Виведіть на консоль значення масиву arr.
- Кінець тіла циклу for.
- Виведіть порожній рядок на консолі.
- Звільнити пам'ять масиву обр.
- Програма поверне значення після успішного завершення.
- Кінець тіла функції main().
Підсумки
- Звичайні масиви мають фіксований розмір. Ви не можете змінити їхній розмір після оголошення.
- Для цих типів масивів розмір пам’яті визначається під час компіляції.
- Динамічні масиви бувають різними. Їх розміри можна змінювати під час роботи.
- У динамічних масивах розмір визначається під час виконання.
- Динамічні масиви в C++ оголошуються за допомогою нового ключового слова.
- Ми використовуємо квадратні дужки, щоб вказати кількість елементів, які будуть зберігатися в динамічному масиві.
- Після завершення роботи з масивом ми можемо звільнити пам’ять за допомогою оператора видалення.
- Використовуйте оператор видалення з [], щоб звільнити пам'ять усіх елементів масиву.
- Видалення без [] звільняє пам’ять лише для одного елемента.
- Немає вбудованого механізму зміни розміру C++ масиви.
- Щоб ініціалізувати масив за допомогою ініціалізатора списку, ми не використовуємо оператор «=».