Какво е динамичен масив?
Динамичният масив е доста подобен на обикновен масив, но неговият размер може да се променя по време на изпълнение на програмата. DynamArray елементите заемат непрекъснат блок памет.
След като масивът е създаден, неговият размер не може да се променя. Динамичният масив обаче е различен. Динамичният масив може да разшири размера си дори след като е попълнен.
По време на създаването на масив му се разпределя предварително определено количество памет. Това не е така при динамичния масив, тъй като той увеличава размера на паметта си с определен фактор, когато има нужда.
В този урок за C ++ ще научите
- Какво е динамичен масив?
- Фактори, влияещи върху работата на динамичните масиви
- Новата ключова дума
- Инициализиране на динамично разпределени масиви
- Преоразмеряване на масиви
- Динамично изтриване на масиви
Фактори, влияещи върху работата на динамичните масиви
Първоначалният размер на масива и неговият растежен фактор определят неговата производителност. Обърнете внимание на следните точки:
- Ако масивът има малък размер и малък растежен фактор, той ще продължи да преразпределя паметта по-често. Това ще намали производителността на масива.
- Ако масивът има голям размер и голям растежен фактор, той ще има огромен брой неизползвана памет. Поради това операциите за преоразмеряване могат да отнемат повече време. Това ще намали производителността на масива.
Новата ключова дума
В C ++ можем да създадем динамичен масив, използвайки новата ключова дума. Броят на елементите, които трябва да бъдат разпределени, е посочен в двойка квадратни скоби. Името на типа трябва да предшества това. Ще бъде разпределен исканият брой елементи.
Синтаксис:
Новата ключова дума приема следния синтаксис:
pointer_variable = new data_type;
Pointer_variable е името на променливата на указателя.
Типът на данните трябва да е валиден тип данни на C ++.
След това ключовата дума връща указател към първия елемент. След създаването на динамичния масив можем да го изтрием с помощта на ключовата дума delete.
Пример 1:
#includeusing 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.
- Отпечатайте малко текст на конзолата.
- Използвайте цикъл for, за да създадете променлива на цикъл x, за да прегледате елементите на масива.
- Отпечатайте стойностите, съдържащи се в масива с име arr на конзолата.
- Край на тялото на цикъла for.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на основната () функция.
ЗАБЕЛЕЖКА: В горния пример на потребителя е разрешено да посочи произволен размер за масива по време на изпълнение. Това означава, че размерът на масива се определя по време на изпълнение .
Инициализиране на динамично разпределени масиви
Лесно е да инициализирате динамичен масив до 0.
Синтаксис:
int *array{ new int[length]{} };
В горния синтаксис дължината означава броя на елементите, които трябва да бъдат добавени към масива. Тъй като трябва да инициализираме масива до 0, това трябва да остане празно.
Можем да инициализираме динамичен масив, като използваме инициализационен списък. Нека създадем пример, който демонстрира това.
Пример 2:
#includeusing 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.
- Декларирайте динамичен масив, наречен масив, като използвате списък за инициализация. Масивът ще съдържа 5 цели числа. Имайте предвид, че не сме използвали оператора между дължината на масива и списъка на инициализатора.
- Отпечатайте малко текст на конзолата. Endl е ключова дума на C ++, която означава краен ред. Премества курсора към следващото изречение.
- Използвайте цикъл for, за да прегледате елементите на масива.
- Отпечатайте съдържанието на масива с име array на конзолата.
- Край на тялото на цикъла for.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на основната () функция.
Преоразмеряване на масиви
Дължината на динамичен масив се задава по време на разпределението.
C ++ обаче няма вграден механизъм за преоразмеряване на масив, след като е бил разпределен.
Можете обаче да преодолеете това предизвикателство, като динамично разпределяте нов масив, копирате върху елементите и след това изтривате стария масив.
Забележка: че тази техника е склонна към грешки, затова се опитайте да я избегнете.
Динамично изтриване на масиви
Динамичен масив трябва да бъде изтрит от паметта на компютъра, след като целта му бъде изпълнена. Изтриването може да ви помогне да постигнете това. След това освободеното пространство в паметта може да се използва за съхранение на друг набор от данни. Въпреки това, дори ако не изтриете динамичния масив от паметта на компютъра, той ще бъде изтрит автоматично, след като програмата се прекрати.
Забележка:
За да изтриете динамичен масив от паметта на компютъра, трябва да използвате изтриване [], вместо изтриване. [] Инструктира процесора да изтрива множество променливи, а не една променлива. Използването на delete вместо delete [] при работа с динамичен масив може да доведе до проблеми. Примери за такива проблеми включват изтичане на памет, повреда на данни, сривове и т.н.
Пример 3:
#includeusing 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 ще запази малко памет, за да съхрани общо n цели числа.
- Отпечатайте съобщение на конзолата, подканващо потребителя да въведе n числа.
- Създайте цикъл for и променливата на цикъл x, за да прегледате числата, въведени от потребителя.
- Прочетете числата, въведени от потребителя, и ги съхранявайте в масива arr.
- Край на тялото на цикъла for.
- Отпечатайте малко текст на конзолата.
- Използвайте цикъл for и променливата на цикъл x, за да прегледате съдържанието на масива arr.
- Отпечатайте стойностите на масива arr на конзолата.
- Край на тялото на цикъла for.
- Отпечатайте празен ред на конзолата.
- Освободете паметта на масива arr.
- Програмата ще върне стойност, когато завърши успешно.
- Край на тялото на основната () функция.
Резюме:
- Редовните масиви имат фиксиран размер. След декларирането им не можете да променяте размера им.
- При тези типове масиви размерът на паметта се определя по време на компилиране.
- Динамичните масиви са различни. Размерите им могат да се променят по време на изпълнение.
- В динамичните масиви размерът се определя по време на изпълнение.
- Динамичните масиви в C ++ се декларират с помощта на новата ключова дума.
- Използваме квадратни скоби, за да определим броя на елементите, които да се съхраняват в динамичния масив.
- След като приключим с масива, можем да освободим паметта с помощта на оператора delete.
- Използвайте оператора delete с [], за да освободите паметта на всички елементи на масива.
- Изтриването без [] освобождава паметта само на един елемент.
- Няма вграден механизъм за преоразмеряване на масиви C ++.
- За да инициализираме масив с помощта на инициализатор на списък, ние не използваме оператора .