Шта је динамички низ?
Динамички низ је прилично сличан редовном низу, али његова величина се може променити током извођења програма. Елементи ДинамАрраи заузимају непрекидни блок меморије.
Једном када је низ створен, његова величина се не може променити. Међутим, динамички низ је другачији. Динамички низ може проширити своју величину чак и након што је попуњен.
Током стварања низа додељује му се унапред одређена количина меморије. То није случај са динамичким низом, јер он повећава своју меморију за одређени фактор када постоји потреба.
У овом упутству за Ц ++ ћете научити
- Шта је динамички низ?
- Фактори који утичу на перформансе динамичких низова
- Нова кључна реч
- Иницијализација динамички додељених низова
- Промена величине низова
- Динамичко брисање низова
Фактори који утичу на перформансе динамичких низова
Почетне величине низа и фактор раста одређују његове перформансе. Обратите пажњу на следеће тачке:
- Ако низ има малу величину и мали фактор раста, чешће ће задржати меморију за прерасподелу. Ово ће смањити перформансе низа.
- Ако низ има велику величину и велики фактор раста, имаће огроман део неискоришћене меморије. Због тога, операције промене величине могу трајати дуже. Ово ће смањити перформансе низа.
Нова кључна реч
У Ц ++-у можемо створити динамички низ користећи нову кључну реч. Број ставки које ће се доделити наведен је у пару угластих заграда. Име типа треба да претходи овоме. Тражени број предмета биће додељен.
Синтакса:
Нова кључна реч има следећу синтаксу:
pointer_variable = new data_type;
Поинтер_вариабле је име променљиве показивача.
Тип података мора бити важећи тип података Ц ++.
Кључна реч затим враћа показивач на прву ставку. Након креирања динамичког низа, можемо га избрисати помоћу кључне речи делете.
Пример 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;}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите датотеку заглавља иостреам у наш програм да бисте користили његове функције.
- Укључите стд простор имена у наш програм како бисте користили његове класе без позивања.
- Позовите главну () функцију. Логику програма треба додати унутар тела функције.
- Прогласите две целобројне променљиве к и н.
- На конзоли одштампајте текст који од корисника тражи да унесе вредност променљиве н.
- Прочитајте кориснички унос са тастатуре и доделите га променљивој н.
- Прогласите низ који садржи укупно н целих бројева и доделите га променљивој показивача * арр.
- Одштампајте поруку која од корисника тражи да унесе н број ставки.
- Употријебите петљу фор да бисте креирали варијаблу петље к за прелазак преко ставки које је корисник унио.
- Прочитајте елементе које је корисник унео и ускладиштите их у низу арр.
- Крај тела петље фор.
- Одштампајте мало текста на конзоли.
- Користите петљу фор да бисте креирали променљиву петље к за итерацију по ставкама низа.
- Испишите вредности садржане у пољу названом арр на конзоли.
- Крај тела петље фор.
- Програм мора вратити вредност након успешног завршетка.
- Крај тела главне () функције.
НАПОМЕНА: У горњем примеру, кориснику је дозвољено да наведе било коју величину низа током времена извођења. То значи да се величина низа одређује током извођења .
Иницијализација динамички додељених низова
Лако је иницијализовати динамички низ на 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;}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите датотеку заглавља иостреам у наш програм да бисте користили његове функције.
- Укључите стд простор имена у наш програм да користи његове класе без позива.
- Позовите главну () функцију. Логику програма треба додати унутар тела функције.
- Декларишите целобројну променљиву која се зове к.
- Декларирајте динамички низ са именом низ користећи иницијализаторску листу. Низ ће садржати 5 целобројних елемената. Имајте на уму да нисмо користили оператор између дужине низа и листе иницијализатора.
- Одштампајте мало текста на конзоли. Ендл је кључна реч Ц ++ која значи крајњи ред. Премешта курсор на следећу реченицу.
- Користите фор петљу за прелазак преко елемената низа.
- На конзоли одштампајте садржај низа именованог низом.
- Крај тела петље фор.
- Програм мора вратити вредност након успешног завршетка.
- Крај тела главне () функције.
Промена величине низова
Дужина динамичког низа поставља се током времена доделе.
Међутим, Ц ++ нема уграђени механизам за промену величине низа након што је додељен.
Међутим, овај изазов можете превазићи динамичким додељивањем новог низа, копирањем преко елемената, а затим брисањем старог низа.
Напомена: да је ова техника склона грешкама, зато је покушајте избећи.
Динамичко брисање низова
Динамички низ треба избрисати из меморије рачунара када се испуни његова сврха. Изјава за брисање може вам помоћи да то постигнете. Ослобођени меморијски простор се тада може користити за чување другог скупа података. Међутим, чак и ако не избришете динамички низ из меморије рачунара, он ће се аутоматски избрисати када се програм заврши.
Белешка:
Да бисте избрисали динамички низ из меморије рачунара, требало би да користите делете [], уместо делете. [] Налаже ЦПУ-у да избрише више променљивих, а не једну променљиву. Употреба делете уместо делете [] када се ради са динамичким низом може довести до проблема. Примери таквих проблема укључују цурење меморије, оштећење података, падове итд.
Пример 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;}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите иостреам датотеку заглавља у наш програм како бисте користили његове функције.
- Укључите стд простор имена у наш програм како бисте користили његове класе без позивања.
- Позовите главну () функцију. Логику програма треба додати унутар тела функције.
- Декларишите две променљиве к и н целобројног типа података.
- Одштампајте мало текста на конзоли. У тексту ће се од корисника тражити да наведе број бројева које ће унети.
- Читајте унос корисника са тастатуре. Улазна вредност биће додељена променљивој н.
- Објави променљиву показивача * арр. Поље арр ће резервисати нешто меморије за складиштење укупно н целих бројева.
- На конзоли одштампајте поруку која од корисника тражи да унесе н бројева.
- Направите петљу фор и променљиву петље к да бисте прешли преко бројева које је унео корисник.
- Прочитајте бројеве које је корисник унео и сачувајте их у низу поља.
- Крај тела петље фор.
- Одштампајте мало текста на конзоли.
- Користите петљу фор и променљиву петље к да бисте прешли преко садржаја низа арр.
- Испишите вредности поља арр на конзоли.
- Крај тела петље фор.
- Одштампајте празан ред на конзоли.
- Ослободите меморију низа арр.
- Програм ће вратити вредност када се успешно заврши.
- Крај тела главне () функције.
Резиме:
- Редовни низови имају фиксну величину. Једном проглашени не можете мењати њихову величину.
- Код ових врста низова, величина меморије се одређује током времена компајлирања.
- Динамички низови су различити. Њихове величине се могу мењати током извођења.
- У динамичким низовима величина се одређује током извођења.
- Динамички низови у Ц ++ декларисани су помоћу нове кључне речи.
- Углатим заградама користимо да одредимо број ставки које треба сачувати у динамичком низу.
- Када завршимо са низом, можемо ослободити меморију помоћу оператора делете.
- Користите оператер делете са [] да ослободите меморију свих елемената низа.
- Брисање без [] ослобађа меморију само једног елемента.
- Не постоји уграђени механизам за промену величине низова Ц ++.
- Да бисмо иницијализовали низ помоћу иницијализатора листе, не користимо оператор „=“.