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

Какво е динамичен масив?

Динамичният масив е доста подобен на обикновения масив, но размерът му може да се променя по време на изпълнение на програмата. Елементите DynamArray заемат непрекъснат блок памет.

След като масивът е създаден, неговият размер не може да бъде променян. Динамичният масив обаче е различен. Динамичният масив може да разшири размера си дори след като е бил попълнен.

По време на създаването на масив му се разпределя предварително определено количество памет. Това не е случаят с динамичния масив, тъй като той увеличава размера на паметта си с определен фактор, когато има нужда.

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

Първоначалният размер на масива и факторът му на растеж определят неговата производителност. Обърнете внимание на следните точки:

  1. Ако масивът има малък размер и малък фактор на растеж, той ще продължи да преразпределя памет по-често. Това ще намали производителността на масива.
  2. Ако един масив има голям размер и голям фактор на растеж, той ще има огромно парче неизползвана памет. Поради това операциите по преоразмеряване може да отнемат повече време. Това ще намали производителността на масива.

Новата ключова дума

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

Изход:

Новата ключова дума

Ето екранна снимка на кода:

Новата ключова дума

Обяснение на кода:

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

Oбобщение

  • Редовните масиви имат фиксиран размер. Не можете да промените размера им, след като веднъж са декларирани.
  • При тези типове масиви размерът на паметта се определя по време на компилиране.
  • Динамичните масиви са различни. Техните размери могат да се променят по време на изпълнение.
  • В динамичните масиви размерът се определя по време на изпълнение.
  • Динамични масиви в C++ се декларират с новата ключова дума.
  • Използваме квадратни скоби, за да посочим броя на елементите, които да се съхраняват в динамичния масив.
  • След като приключим с масива, можем да освободим памет с помощта на оператора за изтриване.
  • Използвайте оператора за изтриване с [], за да освободите паметта на всички елементи на масива.
  • Изтриване без [] освобождава паметта само на един елемент.
  • Няма вграден механизъм за преоразмеряване C++ масиви.
  • За да инициализираме масив с инициализатор на списък, не използваме оператора “=”.