C++ Dynamisk tildeling af arrays med eksempel

Hvad er et dynamisk array?

Et dynamisk array minder ret meget om et almindeligt array, men dets størrelse kan ændres under programkørsel. DynamArray-elementer optager en sammenhængende hukommelsesblok.

Når først et array er blevet oprettet, kan dets størrelse ikke ændres. Et dynamisk array er dog anderledes. Et dynamisk array kan udvide sin størrelse, selv efter at det er blevet udfyldt.

Under oprettelsen af ​​et array tildeles det en forudbestemt mængde hukommelse. Dette er ikke tilfældet med et dynamisk array, da det øger sin hukommelsesstørrelse med en bestemt faktor, når der er behov.

Faktorer, der påvirker dynamiske arrays ydeevne

Arrayets oprindelige størrelse og vækstfaktor bestemmer dens ydeevne. Bemærk følgende punkter:

  1. Hvis et array har en lille størrelse og en lille vækstfaktor, vil den blive ved med at omallokere hukommelse oftere. Dette vil reducere arrayets ydeevne.
  2. Hvis et array har en stor størrelse og en stor vækstfaktor, vil det have en stor del af ubrugt hukommelse. På grund af dette kan det tage længere tid at ændre størrelse. Dette vil reducere arrayets ydeevne.

Det nye nøgleord

In C++, kan vi oprette et dynamisk array ved hjælp af det nye søgeord. Antallet af genstande, der skal tildeles, er angivet inden for et par firkantede parenteser. Typenavnet skal gå foran dette. Det ønskede antal varer vil blive tildelt.

Syntaks

Det nye nøgleord har følgende syntaks:

pointer_variable = new data_type;

Pointer_variablen er navnet på pointer variabel.

Data_typen skal være en gyldig C++ datatype.

Nøgleordet returnerer derefter en pointer til det første element. Efter at have oprettet det dynamiske array, kan vi slette det ved hjælp af delete nøgleordet.

Eksempel 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:

Det nye nøgleord

Her er et skærmbillede af koden:

Det nye nøgleord

Kodeforklaring:

  1. Inkluder iostream-headerfilen i vores program for at bruge dens funktioner.
  2. Inkluder std-navneområdet i vores program for at bruge dets klasser uden at kalde det.
  3. Kald funktionen main(). Programlogikken skal tilføjes i funktionens krop.
  4. Erklær to heltalsvariable x og n.
  5. Udskriv noget tekst på konsollen, der beder brugeren om at indtaste værdien af ​​variabel n.
  6. Læs brugerinput fra tastaturet og tildel det til variabel n.
  7. Erklærer en matrix til at indeholde i alt n heltal og tildel den til pointervariabelen *arr.
  8. Udskriv en meddelelse, der beder brugeren om at indtaste n antal elementer.
  9. Brug en for-løkke til at oprette en loop-variabel x til at iterere over de elementer, som brugeren har indtastet.
  10. Læs de elementer, brugeren har indtastet, og gem dem i array-arr.
  11. Slutningen af ​​kroppen af til løkke.
  12. Udskriv noget tekst på konsollen.
  13. Brug en for-løkke til at oprette en loop-variabel x til at iterere over elementerne i arrayet.
  14. Udskriv værdierne indeholdt i arrayet med navnet arr på konsollen.
  15. Enden af ​​kroppen af ​​for-løkken.
  16. Programmet skal returnere værdi efter vellykket afslutning.
  17. Slutningen af ​​hoveddelen af ​​funktionen main().

BEMÆRK: I ovenstående eksempel har brugeren lov til at angive en hvilken som helst størrelse for arrayet under kørselstiden. Dette betyder, at arrayets størrelse bestemmes under kørsel.

Initialisering af dynamisk allokerede arrays

Det er nemt at initialisere et dynamisk array til 0.

Syntaks:

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

I ovenstående syntaks angiver længden antallet af elementer, der skal tilføjes til arrayet. Da vi skal initialisere arrayet til 0, bør dette stå tomt.

Vi kan initialisere et dynamisk array ved hjælp af en initialiseringsliste. Lad os skabe et eksempel, der viser dette.

Eksempel 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:

Initialisering af dynamisk allokerede arrays

Her er et skærmbillede af koden:

Initialisering af dynamisk allokerede arrays

Kodeforklaring:

  1. Inkluder iostream-header-filen i vores program for at bruge dens funktioner.
  2. Inkluder std-navneområdet i vores program for at bruge dets klasser uden at kalde det.
  3. Kald funktionen main(). Programlogikken skal tilføjes i funktionens krop.
  4. Erklær en heltalsvariabel ved navn x.
  5. Erklære et dynamisk array med navnet array ved hjælp af en initialiseringsliste. Arrayet vil indeholde 5 heltalselementer. Bemærk, at vi ikke har brugt "="-operatoren mellem array-længden og initialiseringslisten.
  6. Udskriv noget tekst på konsollen. Endl er en C++ søgeord, der betyder slutlinje. Det flytter markøren til næste sætning.
  7. Brug en for-løkke til at iterere over array-elementerne.
  8. Udskriv indholdet af arrayet med navnet array på konsollen.
  9. Enden af ​​kroppen af ​​for-løkken.
  10. Programmet skal returnere værdi efter vellykket afslutning.
  11. Slutningen af ​​hoveddelen af ​​funktionen main().

Ændre størrelse på arrays

Længden af ​​et dynamisk array indstilles under allokeringstiden.

Imidlertid C++ har ikke en indbygget mekanisme til at ændre størrelsen på et array, når det først er blevet allokeret.

Du kan dog overvinde denne udfordring ved at allokere et nyt array dynamisk, kopiere over elementerne og derefter slette det gamle array.

Bemærk: at denne teknik er tilbøjelig til fejl, så prøv at undgå det.

Dynamisk sletning af arrays

Et dynamisk array skal slettes fra computerens hukommelse, når dets formål er opfyldt. Slet-erklæringen kan hjælpe dig med at opnå dette. Den frigivne hukommelsesplads kan derefter bruges til at opbevare et andet sæt data. Men selvom du ikke sletter det dynamiske array fra computerens hukommelse, slettes det automatisk, når programmet afsluttes.

Bemærk:

For at slette et dynamisk array fra computerens hukommelse, skal du bruge delete[], i stedet for delete. [] instruerer CPU'en til at slette flere variabler i stedet for én variabel. Brugen af ​​delete i stedet for delete[], når der er tale om et dynamisk array, kan resultere i problemer. Eksempler på sådanne problemer omfatter hukommelseslækager, datakorruption, nedbrud osv.

Eksempel 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:

Dynamisk sletning af arrays

Her er et skærmbillede af koden:

Dynamisk sletning af arrays

Kodeforklaring:

  1. Inkluder iostream-header-filen i vores program for at bruge dens funktioner.
  2. Inkluder std-navneområdet i vores program for at bruge dets klasser uden at kalde det.
  3. Kald funktionen main(). Programlogikken skal tilføjes i funktionens krop.
  4. Deklarer to variable x og n af heltalsdatatypen.
  5. Udskriv noget tekst på konsollen. Teksten vil bede brugeren om at angive antallet af numre, de vil indtaste.
  6. Læs brugerinput fra tastaturet. Indgangsværdien vil blive tildelt variabel n.
  7. Deklarer en pointervariabel *arr. Arrayet arr vil reservere noget hukommelse til at gemme i alt n heltal.
  8. Udskriv en meddelelse på konsollen, der beder brugeren om at indtaste n tal.
  9. Opret en for-løkke og loop-variablen x for at iterere over de tal, som brugeren har indtastet.
  10. Læs numrene indtastet af brugeren og gem dem i array arr.
  11. Enden af ​​kroppen af ​​for-løkken.
  12. Udskriv noget tekst på konsollen.
  13. Brug en for-løkke og loop-variablen x til at iterere over indholdet af array-arr.
  14. Udskriv værdierne for array arr på konsollen.
  15. Enden af ​​kroppen af ​​for-løkken.
  16. Udskriv en tom linje på konsollen.
  17. Frigør hukommelsen af ​​array arr.
  18. Programmet returnerer værdi, når det er gennemført.
  19. Slutningen af ​​hoveddelen af ​​funktionen main().

Resumé

  • Almindelige arrays har en fast størrelse. Du kan ikke ændre deres størrelse, når de først er deklareret.
  • Med disse typer arrays bestemmes hukommelsesstørrelsen under kompileringstiden.
  • Dynamiske arrays er forskellige. Deres størrelser kan ændres under kørsel.
  • I dynamiske arrays bestemmes størrelsen under kørsel.
  • Dynamiske arrays i C++ erklæres ved hjælp af det nye søgeord.
  • Vi bruger firkantede parenteser til at angive antallet af elementer, der skal gemmes i det dynamiske array.
  • Når vi er færdige med arrayet, kan vi frigøre hukommelsen ved hjælp af delete-operatoren.
  • Brug delete-operatoren med [] for at frigøre hukommelsen for alle array-elementer.
  • En sletning uden [] frigør kun hukommelsen for et enkelt element.
  • Der er ingen indbygget mekanisme til at ændre størrelse C++ arrays.
  • For at initialisere et array ved hjælp af en listeinitialiserer, bruger vi ikke "="-operatoren.

Læs mere Læs mere