C++ Massiivide dünaamiline jaotamine näitega

Mis on dünaamiline massiiv?

Dünaamiline massiiv on üsna sarnane tavalise massiiviga, kuid selle suurust saab programmi käitamise ajal muuta. DynamArray elemendid hõivavad külgneva mäluploki.

Kui massiiv on loodud, ei saa selle suurust muuta. Dünaamiline massiiv on aga erinev. Dünaamiline massiiv võib oma suurust laiendada isegi pärast selle täitmist.

Massiivi loomise ajal eraldatakse sellele etteantud mälumaht. Dünaamilise massiivi puhul see nii ei ole, kuna vajaduse korral suurendab see mälumahtu teatud teguri võrra.

Dünaamiliste massiivide toimivust mõjutavad tegurid

Massiivi esialgne suurus ja kasvutegur määravad selle jõudluse. Pange tähele järgmisi punkte:

  1. Kui massiivil on väike suurus ja väike kasvutegur, jaotab see mälu sagedamini ümber. See vähendab massiivi jõudlust.
  2. Kui massiivil on suur suurus ja suur kasvutegur, on sellel tohutu hulk kasutamata mälu. Seetõttu võivad suuruse muutmise toimingud võtta kauem aega. See vähendab massiivi jõudlust.

Uus märksõna

In C++, saame uue märksõna abil luua dünaamilise massiivi. Eraldatavate üksuste arv määratakse nurksulgudes. Tüübi nimi peaks sellele eelnema. Vajalik arv esemeid eraldatakse.

Süntaks

Uuel märksõnal on järgmine süntaks:

pointer_variable = new data_type;

Pointer_muutuja on nimi osuti muutuja.

Data_type peab olema kehtiv C++ andmetüüp.

Seejärel tagastab märksõna kursori esimesele üksusele. Pärast dünaamilise massiivi loomist saame selle kustutada märksõna kustutamise abil.

Näide 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;
}

Väljund:

Uus märksõna

Siin on koodi ekraanipilt:

Uus märksõna

Koodi selgitus:

  1. Kaasake iostreami päisefail selle kasutamiseks meie programmi funktsioonid.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige kaks täisarvu muutujat x ja n.
  5. Printige konsoolile tekst, mis palub kasutajal sisestada muutuja n väärtus.
  6. Lugege klaviatuurilt kasutaja sisendit ja määrake see muutujale n.
  7. Deklareerige massiiv nii, et see sisaldab kokku n täisarvu ja määrake see osuti muutujale *arr.
  8. Printige sõnum, milles palutakse kasutajal sisestada n arv üksusi.
  9. Kasutage for-tsüklit, et luua tsüklimuutuja x, et korrata kasutaja sisestatud üksusi.
  10. Lugege kasutaja sisestatud elemente ja salvestage need massiivi arr.
  11. Keha lõpp silmuse jaoks.
  12. Printige konsoolile teksti.
  13. Kasutage tsüklit for, et luua tsüklimuutuja x, et korrata massiivi üksusi.
  14. Printige välja väärtused, mis sisalduvad konsooli massiivis nimega arr.
  15. For-silmuse keha lõpp.
  16. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  17. Funktsiooni main() keha lõpp.

MÄRKUS. Ülaltoodud näites on kasutajal lubatud käitamisajal määrata massiivi mis tahes suurus. See tähendab, et massiivi suurus määratakse käitusajal.

Dünaamiliselt eraldatud massiivide lähtestamine

Dünaamilise massiivi lähtestamine nulliks on lihtne.

süntaksit:

int *array{ new int[length]{} };

Ülaltoodud süntaksis tähistab pikkus massiivi lisatavate elementide arvu. Kuna peame massiivi lähtestama nulliks, tuleks see tühjaks jätta.

Dünaamilise massiivi saame lähtestada lähtestajate loendi abil. Loome näite, mis seda demonstreerib.

Näide 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;
}

Väljund:

Dünaamiliselt eraldatud massiivide lähtestamine

Siin on koodi ekraanipilt:

Dünaamiliselt eraldatud massiivide lähtestamine

Koodi selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige täisarvuline muutuja nimega x.
  5. Deklareerige dünaamiline massiiv nimega massiiv, kasutades lähtestajate loendit. Massiivis on 5 täisarvu elementi. Pange tähele, et me ei ole kasutanud massiivi pikkuse ja lähtestajate loendi vahel operaatorit "=".
  6. Printige konsoolile teksti. Endl on a C++ märksõna, mis tähendab lõpprida. See viib kursori järgmisele lausele.
  7. Kasutage massiivi elementide kordamiseks tsüklit for.
  8. Printige konsoolile massiivi nimega massiiv sisu.
  9. For-silmuse keha lõpp.
  10. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  11. Funktsiooni main() keha lõpp.

Massiivide suuruse muutmine

Dünaamilise massiivi pikkus määratakse jaotamisaja jooksul.

Kuid C++ ei ole sisseehitatud mehhanismi massiivi suuruse muutmiseks, kui see on eraldatud.

Selle väljakutse saate siiski ületada, eraldades dünaamiliselt uue massiivi, kopeerides elemendid üle ja kustutades seejärel vana massiivi.

Märkus: see tehnika on altid vigadele, seega proovige seda vältida.

Massiivide dünaamiline kustutamine

Dünaamiline massiiv tuleks arvuti mälust kustutada, kui selle eesmärk on täidetud. Kustutusavaldus aitab teil seda teha. Vabanenud mäluruumi saab seejärel kasutada teise andmekogumi hoidmiseks. Isegi kui te dünaamilist massiivi arvutimälust ei kustuta, kustutatakse see programmi lõppedes automaatselt.

Märge:

Dünaamilise massiivi arvutimälust kustutamiseks kasutage kustutamise asemel käsku delete[]. [] annab CPU-le korralduse kustutada ühe muutuja asemel mitu muutujat. Dünaamilise massiiviga tegelemisel käsu delete [] asemel kustutamine võib põhjustada probleeme. Selliste probleemide näideteks on mälulekked, andmete riknemine, kokkujooksmised jne.

Näide 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;
}

Väljund:

Massiivide dünaamiline kustutamine

Siin on koodi ekraanipilt:

Massiivide dünaamiline kustutamine

Koodi selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige kaks täisarvulise andmetüübi muutujat x ja n.
  5. Printige konsoolile teksti. Tekst palub kasutajal märkida sisestatavate numbrite arv.
  6. Lugege klaviatuurilt kasutaja sisendit. Sisendväärtus määratakse muutujale n.
  7. Deklareerib kursori muutuja *arr. Massiivi arr reserveerib natuke mälu, et salvestada kokku n täisarvu.
  8. Printige konsoolile sõnum, mis palub kasutajal sisestada n numbrit.
  9. Loo for-silmus ja tsüklimuutuja x, et korrata kasutaja sisestatud numbreid.
  10. Lugege kasutaja sisestatud numbreid ja salvestage need massiivi arr.
  11. For-silmuse keha lõpp.
  12. Printige konsoolile teksti.
  13. Massiivi arr sisu kordamiseks kasutage tsüklit for ja tsüklimuutujat x.
  14. Printige konsoolil välja massiivi arr väärtused.
  15. For-silmuse keha lõpp.
  16. Printige konsoolile tühi rida.
  17. Vabastage massiivi arr mälu.
  18. Programm tagastab väärtuse, kui see on edukalt lõpule viidud.
  19. Funktsiooni main() keha lõpp.

kokkuvõte

  • Tavalistel massiividel on kindel suurus. Pärast deklareerimist ei saa te nende suurust muuta.
  • Seda tüüpi massiivide puhul määratakse mälu suurus kompileerimise ajal.
  • Dünaamilised massiivid on erinevad. Nende suurust saab tööajal muuta.
  • Dünaamilistes massiivides määratakse suurus käitusajal.
  • Dünaamilised massiivid sisse C++ on deklareeritud uue märksõna abil.
  • Dünaamilises massiivis salvestatavate üksuste arvu määramiseks kasutame nurksulgusid.
  • Kui massiiv on valmis, saame kustutamisoperaatori abil mälu vabastada.
  • Kasutage kustutamisoperaatorit koos []-ga, et vabastada kõigi massiivi elementide mälu.
  • Kustutamine ilma []ta vabastab ainult ühe elemendi mälu.
  • Suuruse muutmiseks pole sisseehitatud mehhanismi C++ massiivid.
  • Massiivi lähtestamiseks loendi lähtestaja abil ei kasuta me operaatorit „=”.