C++ Tömbök dinamikus kiosztása példával
Mi az a dinamikus tömb?
A dinamikus tömb nagyon hasonlít egy normál tömbhöz, de mérete a program futása során módosítható. A DynamArray elemek egy összefüggő memóriablokkot foglalnak el.
A tömb létrehozása után a mérete nem módosítható. A dinamikus tömb azonban más. A dinamikus tömb méretét még kitöltése után is bővítheti.
Egy tömb létrehozása során előre meghatározott mennyiségű memóriát foglalnak le. Ez nem így van a dinamikus tömbök esetében, mivel szükség esetén egy bizonyos tényezővel növeli a memória méretét.
A dinamikus tömbök teljesítményét befolyásoló tényezők
A tömb kezdeti mérete és növekedési tényezője határozza meg a teljesítményét. Vegye figyelembe a következő pontokat:
- Ha egy tömbnek kicsi a mérete és kicsi a növekedési tényezője, akkor gyakrabban fogja újrafoglalni a memóriát. Ez csökkenti a tömb teljesítményét.
- Ha egy tömb nagy méretű és nagy növekedési faktorral rendelkezik, akkor hatalmas mennyiségű kihasználatlan memóriája lesz. Emiatt az átméretezési műveletek tovább tarthatnak. Ez csökkenti a tömb teljesítményét.
Az új kulcsszó
In C++, létrehozhatunk egy dinamikus tömböt az új kulcsszó használatával. A kiosztandó elemek száma szögletes zárójelben van megadva. A típusnévnek ezt kell megelőznie. A kért darabszám kiosztásra kerül.
Szintaxis
Az új kulcsszó a következő szintaxist használja:
pointer_variable = new data_type;
A pointer_variable a neve mutató változó.
Az adattípusnak érvényesnek kell lennie C++ adattípus.
A kulcsszó ezután egy mutatót ad vissza az első elemre. A dinamikus tömb létrehozása után a delete kulcsszó segítségével törölhetjük.
Példa 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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programunkba a használatához funkciók.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Deklaráljunk két x és n egész változót.
- Nyomtasson ki néhány szöveget a konzolra, amely felszólítja a felhasználót az n változó értékének megadására.
- Olvassa be a felhasználói bevitelt a billentyűzetről, és rendelje hozzá az n változóhoz.
- Deklaráljon egy tömböt úgy, hogy összesen n egész számot tartalmazzon, és rendelje hozzá az *arr mutatóváltozóhoz.
- Nyomtasson ki egy üzenetet, amelyben felszólítja a felhasználót n számú elem megadására.
- Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a felhasználó által beírt elemeket ismételheti.
- Olvassa be a felhasználó által beírt elemeket, és tárolja azokat az arr tömbben.
- A test vége a hurokhoz.
- Nyomtasson szöveget a konzolra.
- Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a tömb elemei között ismétlődik.
- Nyomtassa ki az arr nevű tömbben található értékeket a konzolon.
- A for ciklus törzsének vége.
- A programnak értéket kell visszaadnia a sikeres befejezés után.
- A main() függvény törzsének vége.
MEGJEGYZÉS: A fenti példában a felhasználó bármilyen méretet megadhat a tömbhöz futás közben. Ez azt jelenti, hogy a tömb méretét a rendszer futás közben határozza meg.
Dinamikusan lefoglalt tömbök inicializálása
Könnyen inicializálható egy dinamikus tömb 0-ra.
Syntax:
int *array{ new int[length]{} };
A fenti szintaxisban a hossz a tömbhöz hozzáadandó elemek számát jelöli. Mivel a tömböt 0-ra kell inicializálnunk, ezt üresen kell hagyni.
Egy dinamikus tömböt inicializálhatunk inicializáló lista segítségével. Hozzunk létre egy példát, amely ezt szemlélteti.
Példa 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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programunkba a funkcióinak használatához.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Deklaráljunk egy x nevű egész változót.
- Egy tömb nevű dinamikus tömb deklarálása inicializáló lista segítségével. A tömb 5 egész elemet tartalmaz. Vegye figyelembe, hogy nem használtuk az „=” operátort a tömb hossza és az inicializáló lista között.
- Nyomtasson szöveget a konzolra. A endl egy C++ kulcsszó, ami a végsort jelenti. A kurzort a következő mondatra viszi.
- Használja a for ciklust a tömbelemek ismétléséhez.
- Nyomtassa ki a tömb nevű tömb tartalmát a konzolon.
- A for ciklus törzsének vége.
- A programnak értéket kell visszaadnia a sikeres befejezés után.
- A main() függvény törzsének vége.
Tömbök átméretezése
A dinamikus tömb hosszát az allokációs idő alatt állítjuk be.
Azonban, C++ nem rendelkezik beépített mechanizmussal a tömb átméretezésére, miután lefoglalták.
Ezt a kihívást azonban leküzdheti egy új tömb dinamikus kiosztásával, az elemek átmásolásával, majd a régi tömb törlésével.
Megjegyzés: ez a technika hajlamos a hibákra, ezért próbálja meg elkerülni.
Tömbök dinamikus törlése
A dinamikus tömböt törölni kell a számítógép memóriájából, ha elérte a célját. A törlési utasítás segíthet ennek megvalósításában. A felszabaduló memóriaterület ezután újabb adathalmaz tárolására használható. Azonban még ha nem is törli a dinamikus tömböt a számítógép memóriájából, az automatikusan törlődik, amint a program leáll.
Jegyzet:
Ha dinamikus tömböt szeretne törölni a számítógép memóriájából, használja a delete[] parancsot a delete helyett. A [] arra utasítja a CPU-t, hogy egy változó helyett több változót töröljön. A delete [] helyett a delete használata dinamikus tömbök kezelésekor problémákat okozhat. Ilyen problémák például a memóriaszivárgás, az adatsérülés, az összeomlások stb.
Példa 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; }
output:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a programunkba, hogy használni tudja a funkcióit.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Deklarálja az egész adattípus két x és n változóját.
- Nyomtasson szöveget a konzolra. A szöveg arra kéri a felhasználót, hogy adja meg a beírandó számok számát.
- Felhasználói bevitel olvasása a billentyűzetről. A bemeneti érték az n változóhoz lesz hozzárendelve.
- Mutatóváltozó deklarálása *arr. Az arr tömb lefoglal némi memóriát összesen n egész szám tárolására.
- Nyomtasson ki egy üzenetet a konzolon, amelyben a felhasználót n szám megadására kéri.
- Hozzon létre egy for ciklust és az x ciklusváltozót, hogy a felhasználó által beírt számokon áthaladjon.
- Olvassa be a felhasználó által beírt számokat, és tárolja azokat az arr tömbben.
- A for ciklus törzsének vége.
- Nyomtasson szöveget a konzolra.
- Használja a for ciklust és az x ciklusváltozót az arr tömb tartalmának ismétléséhez.
- Nyomtassa ki az arr tömb értékeit a konzolon.
- A for ciklus törzsének vége.
- Nyomtasson egy üres sort a konzolra.
- Szabadítsa fel az arr tömb memóriáját.
- A program értéket ad vissza, ha sikeresen befejeződik.
- A main() függvény törzsének vége.
Összegzésként
- A szabályos tömbök fix méretűek. A méretük megadása után nem módosítható.
- Az ilyen típusú tömböknél a memória mérete a fordítási idő alatt kerül meghatározásra.
- A dinamikus tömbök különbözőek. A méretük futás közben változtatható.
- A dinamikus tömbökben a méret futás közben kerül meghatározásra.
- Dinamikus tömbök be C++ az új kulcsszó használatával deklarálják.
- Szögletes zárójelekkel határozzuk meg a dinamikus tömbben tárolandó elemek számát.
- Ha elkészültünk a tömbbel, a delete operátor segítségével felszabadíthatjuk a memóriát.
- Használja a delete operátort a []-vel az összes tömbelem memóriájának felszabadításához.
- A [] nélküli törlés csak egyetlen elem memóriáját szabadítja fel.
- Nincs beépített mechanizmus az átméretezéshez C++ tömbök.
- Egy tömb listainicializálóval történő inicializálásához nem használjuk az „=” operátort.