Čo je to dynamické pole?
Dynamické pole je dosť podobné bežnému poľu, ale jeho veľkosť je počas behu programu zmeniteľná. Prvky DynamArray zaberajú súvislý blok pamäte.
Po vytvorení poľa sa jeho veľkosť nedá zmeniť. Dynamické pole je však iné. Dynamické pole môže zväčšiť svoju veľkosť aj po vyplnení.
Počas vytvárania poľa sa mu pridelí vopred určené množstvo pamäte. Toto nie je prípad dynamického poľa, pretože v prípade potreby zväčšuje veľkosť pamäte o určitý faktor.
V tomto výučbe pre C ++ sa naučíte
- Čo je to dynamické pole?
- Faktory ovplyvňujúce výkon dynamických polí
- Nové kľúčové slovo
- Inicializácia dynamicky alokovaných polí
- Zmena veľkosti polí
- Dynamické mazanie polí
Faktory ovplyvňujúce výkon dynamických polí
Jeho výkonnosť určuje počiatočná veľkosť poľa a jeho rastový faktor. Nezabudnite na nasledujúce body:
- Ak má pole malú veľkosť a malý rastový faktor, bude pokračovať v prerozdeľovaní pamäte častejšie. Tým sa zníži výkonnosť poľa.
- Ak má pole veľkú veľkosť a veľký rastový faktor, bude mať obrovský kus nevyužitej pamäte. Z tohto dôvodu môže zmena veľkosti operácie trvať dlhšie. Tým sa zníži výkonnosť poľa.
Nové kľúčové slovo
V C ++ môžeme vytvoriť dynamické pole pomocou nového kľúčového slova. Počet položiek, ktoré sa majú prideliť, je uvedený v dvojici hranatých zátvoriek. Pred týmto by mal byť uvedený názov typu. Bude pridelený požadovaný počet položiek.
Syntax:
Nové kľúčové slovo má nasledujúcu syntax:
pointer_variable = new data_type;
Pointer_variable je názov premennej pointer.
Data_type musí byť platný dátový typ C ++.
Kľúčové slovo potom vráti ukazovateľ na prvú položku. Po vytvorení dynamického poľa ho môžeme vymazať pomocou kľúčového slova delete.
Príklad 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;}
Výkon:
Tu je snímka obrazovky s kódom:
Vysvetlenie kódu:
- Zahrňte súbor hlavičky iostream do nášho programu, aby ste mohli využívať jeho funkcie.
- Zahrňte štandardný priestor mien do nášho programu, aby ste mohli používať jeho triedy bez jeho volania.
- Zavolajte funkciu main (). Logika programu by mala byť pridaná do tela funkcie.
- Deklarujte dve celočíselné premenné x a n.
- Vytlačte na konzolu text, ktorý vyzve používateľa na zadanie hodnoty premennej n.
- Prečítajte si vstup používateľa z klávesnice a priraďte ho k premennej n.
- Deklarujte pole, ktoré obsahuje celkom n celých čísel a priraďte ho k premennej ukazovateľa * arr.
- Vytlačte správu s výzvou na zadanie n počtu položiek.
- Pomocou slučky for vytvorte premennú slučky x na iteráciu nad položkami zadanými používateľom.
- Prečítajte si prvky zadané používateľom a uložte ich do poľa Arr.
- Koniec tela slučky for.
- Vytlačte nejaký text na konzolu.
- Pomocou slučky for vytvorte premennú slučky x na iteráciu nad položkami poľa.
- Vytlačte na konzole hodnoty obsiahnuté v poli s názvom arr.
- Koniec tela slučky for.
- Po úspešnom dokončení musí program vrátiť hodnotu.
- Koniec tela hlavnej () funkcie.
POZNÁMKA: Vo vyššie uvedenom príklade je používateľovi dovolené počas behu určiť ľubovoľnú veľkosť poľa. To znamená, že veľkosť poľa je určená počas behu programu .
Inicializácia dynamicky alokovaných polí
Je ľahké inicializovať dynamické pole na 0.
Syntax:
int *array{ new int[length]{} };
Vo vyššie uvedenej syntaxi dĺžka označuje počet prvkov, ktoré sa majú pridať do poľa. Pretože musíme inicializovať pole na 0, malo by zostať prázdne.
Dynamické pole môžeme inicializovať pomocou zoznamu inicializátorov. Vytvorme si príklad, ktorý to demonštruje.
Príklad 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;}
Výkon:
Tu je snímka obrazovky s kódom:
Vysvetlenie kódu:
- Zahrňte súbor hlavičky iostream do nášho programu, aby ste mohli využívať jeho funkcie.
- Zahrňte do nášho programu std namespace, aby ste mohli používať jeho triedy bez toho, aby ste ich volali.
- Zavolajte funkciu main (). Logika programu by mala byť pridaná do tela funkcie.
- Deklarujte celočíselnú premennú s názvom x.
- Deklarujte dynamické pole s názvom pole pomocou zoznamu inicializátorov. Pole bude obsahovať 5 celočíselných prvkov. Upozorňujeme, že sme medzi dĺžkou poľa a zoznamom inicializátorov nepoužili operátor „=“.
- Vytlačte nejaký text na konzolu. Endl je kľúčové slovo C ++, ktoré znamená koncový riadok. Posunie kurzor na nasledujúcu vetu.
- Na opakovanie prvkov poľa použite slučku for.
- Vytlačte obsah poľa s názvom pole na konzolu.
- Koniec tela slučky for.
- Po úspešnom dokončení musí program vrátiť hodnotu.
- Koniec tela hlavnej () funkcie.
Zmena veľkosti polí
Dĺžka dynamického poľa sa nastavuje počas alokačného času.
C ++ však nemá zabudovaný mechanizmus zmeny veľkosti poľa po jeho pridelení.
Túto výzvu však môžete prekonať dynamickým prideľovaním nového poľa, kopírovaním cez prvky a vymazaním starého poľa.
Poznámka: táto technika je náchylná na chyby, preto sa jej snažte vyhnúť.
Dynamické mazanie polí
Po splnení účelu by malo byť dynamické pole z pamäte počítača odstránené. Vyhlásenie o odstránení vám môže pomôcť dosiahnuť toto. Uvoľnené miesto v pamäti sa potom môže použiť na uloženie ďalšej sady údajov. Avšak aj keď nevymažete dynamické pole z pamäte počítača, po ukončení programu sa automaticky vymaže.
Poznámka:
Ak chcete vymazať dynamické pole z pamäte počítača, mali by ste namiesto odstránenia použiť delete []. [] Dáva CPU pokyn na vymazanie viacerých premenných namiesto jednej. Používanie príkazu delete namiesto príkazu [] pri práci s dynamickým poľom môže mať za následok problémy. Medzi príklady takýchto problémov patrí únik pamäte, poškodenie údajov, zlyhania atď.
Príklad 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;}
Výkon:
Tu je snímka obrazovky s kódom:
Vysvetlenie kódu:
- Zahrňte súbor hlavičky iostream do nášho programu, aby ste mohli využívať jeho funkcie.
- Zahrňte štandardný priestor mien do nášho programu, aby ste mohli používať jeho triedy bez jeho volania.
- Zavolajte funkciu main (). Logika programu by mala byť pridaná do tela funkcie.
- Deklarujte dve premenné x a n celočíselného údajového typu.
- Vytlačte nejaký text na konzolu. V texte bude používateľ vyzvaný k uvedeniu počtu čísel, ktoré zadá.
- Prečítajte si vstup používateľa z klávesnice. Vstupná hodnota bude priradená k premennej n.
- Deklarujte premennú ukazovateľa * arr. Array poľa si vyhradí časť pamäte na uloženie celkom n celých čísel.
- Vytlačte na konzolu správu vyzývajúcu používateľa k zadaniu n čísel.
- Vytvorte cyklus for a premennú cyklu x na iteráciu čísel zadaných používateľom.
- Prečítajte si čísla zadané používateľom a uložte ich do poľa Arr.
- Koniec tela slučky for.
- Vytlačte nejaký text na konzolu.
- Použite cyklus for a premennú cyklu x na iteráciu obsahu poľa Arr.
- Vytlačte hodnoty poľa Arr na konzole.
- Koniec tela slučky for.
- Na konzole vytlačte prázdny riadok.
- Uvoľnite pamäť aretácii poľa.
- Po úspešnom dokončení program vráti hodnotu.
- Koniec tela hlavnej () funkcie.
Zhrnutie:
- Pravidelné polia majú pevnú veľkosť. Po deklarácii nemôžete zmeniť ich veľkosť.
- U týchto typov polí sa veľkosť pamäte určuje počas kompilácie.
- Dynamické polia sú rôzne. Ich veľkosť sa dá počas behu meniť.
- V dynamických poliach sa veľkosť určuje počas behu programu.
- Dynamické polia v C ++ sa deklarujú pomocou nového kľúčového slova.
- V hranatých zátvorkách uvádzame počet položiek, ktoré sa majú uložiť v dynamickom poli.
- Po dokončení s poľom môžeme uvoľniť pamäť pomocou operátora mazania.
- Na uvoľnenie pamäte všetkých prvkov poľa použite operátor odstránenia pomocou [].
- Vymazanie bez [] uvoľní pamäť iba jedného prvku.
- Neexistuje žiadny vstavaný mechanizmus na zmenu veľkosti polí C ++.
- Na inicializáciu poľa pomocou inicializátora zoznamu nepoužívame operátor .