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:

  1. 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.
  2. 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:

Az új kulcsszó

Itt van egy képernyőkép a kódról:

Az új kulcsszó

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programunkba a használatához funkciók.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklaráljunk két x és n egész változót.
  5. 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.
  6. Olvassa be a felhasználói bevitelt a billentyűzetről, és rendelje hozzá az n változóhoz.
  7. Deklaráljon egy tömböt úgy, hogy összesen n egész számot tartalmazzon, és rendelje hozzá az *arr mutatóváltozóhoz.
  8. Nyomtasson ki egy üzenetet, amelyben felszólítja a felhasználót n számú elem megadására.
  9. Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a felhasználó által beírt elemeket ismételheti.
  10. Olvassa be a felhasználó által beírt elemeket, és tárolja azokat az arr tömbben.
  11. A test vége a hurokhoz.
  12. Nyomtasson szöveget a konzolra.
  13. Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a tömb elemei között ismétlődik.
  14. Nyomtassa ki az arr nevű tömbben található értékeket a konzolon.
  15. A for ciklus törzsének vége.
  16. A programnak értéket kell visszaadnia a sikeres befejezés után.
  17. 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:

Dinamikusan lefoglalt tömbök inicializálása

Itt van egy képernyőkép a kódról:

Dinamikusan lefoglalt tömbök inicializálása

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programunkba a funkcióinak használatához.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklaráljunk egy x nevű egész változót.
  5. 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.
  6. Nyomtasson szöveget a konzolra. A endl egy C++ kulcsszó, ami a végsort jelenti. A kurzort a következő mondatra viszi.
  7. Használja a for ciklust a tömbelemek ismétléséhez.
  8. Nyomtassa ki a tömb nevű tömb tartalmát a konzolon.
  9. A for ciklus törzsének vége.
  10. A programnak értéket kell visszaadnia a sikeres befejezés után.
  11. 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:

Tömbök dinamikus törlése

Itt van egy képernyőkép a kódról:

Tömbök dinamikus törlése

Kód magyarázata:

  1. Szerelje be az iostream fejlécfájlt a programunkba, hogy használni tudja a funkcióit.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklarálja az egész adattípus két x és n változóját.
  5. 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.
  6. Felhasználói bevitel olvasása a billentyűzetről. A bemeneti érték az n változóhoz lesz hozzárendelve.
  7. 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.
  8. Nyomtasson ki egy üzenetet a konzolon, amelyben a felhasználót n szám megadására kéri.
  9. Hozzon létre egy for ciklust és az x ciklusváltozót, hogy a felhasználó által beírt számokon áthaladjon.
  10. Olvassa be a felhasználó által beírt számokat, és tárolja azokat az arr tömbben.
  11. A for ciklus törzsének vége.
  12. Nyomtasson szöveget a konzolra.
  13. Használja a for ciklust és az x ciklusváltozót az arr tömb tartalmának ismétléséhez.
  14. Nyomtassa ki az arr tömb értékeit a konzolon.
  15. A for ciklus törzsének vége.
  16. Nyomtasson egy üres sort a konzolra.
  17. Szabadítsa fel az arr tömb memóriáját.
  18. A program értéket ad vissza, ha sikeresen befejeződik.
  19. 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.