C++ Dynamisk tilldelning av arrayer med exempel

Vad är en Dynamic Array?

En dynamisk array är ganska lik en vanlig array, men dess storlek kan ändras under programkörning. DynamArray-element upptar ett sammanhängande minnesblock.

När en array väl har skapats kan dess storlek inte ändras. En dynamisk array är dock annorlunda. En dynamisk array kan utöka sin storlek även efter att den har fyllts.

Under skapandet av en array tilldelas den en förutbestämd mängd minne. Detta är inte fallet med en dynamisk array eftersom den ökar sin minnesstorlek med en viss faktor när det finns ett behov.

Faktorer som påverkar prestandan hos Dynamic Arrays

Arrayens initiala storlek och dess tillväxtfaktor avgör dess prestanda. Observera följande punkter:

  1. Om en array har en liten storlek och en liten tillväxtfaktor kommer den att fortsätta att omfördela minne oftare. Detta kommer att minska arrayens prestanda.
  2. Om en array har en stor storlek och en stor tillväxtfaktor kommer den att ha en stor del oanvänt minne. På grund av detta kan det ta längre tid att ändra storlek. Detta kommer att minska arrayens prestanda.

Det nya nyckelordet

In C++, kan vi skapa en dynamisk array med det nya nyckelordet. Antalet objekt som ska tilldelas anges inom ett par hakparenteser. Typnamnet ska föregå detta. Det begärda antalet artiklar kommer att tilldelas.

syntax

Det nya nyckelordet har följande syntax:

pointer_variable = new data_type;

Pointer_variablen är namnet på pekarvariabel.

Data_typen måste vara en giltig C++ data typ.

Nyckelordet returnerar sedan en pekare till det första objektet. Efter att ha skapat den dynamiska arrayen kan vi ta bort den med nyckelordet delete.

Exempel 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;
}

Produktion:

Det nya nyckelordet

Här är en skärmdump av koden:

Det nya nyckelordet

Kodförklaring:

  1. Inkludera iostream-huvudfilen i vårt program för att använda dess funktioner.
  2. Inkludera std-namnområdet i vårt program för att kunna använda dess klasser utan att anropa det.
  3. Anropa main()-funktionen. Programlogiken bör läggas till i funktionens kropp.
  4. Deklarera två heltalsvariabler x och n.
  5. Skriv ut lite text på konsolen som uppmanar användaren att ange värdet för variabel n.
  6. Läs användarinmatning från tangentbordet och tilldela den till variabel n.
  7. Deklarera att en array innehåller totalt n heltal och tilldela den till pekarvariabeln *arr.
  8. Skriv ut ett meddelande som uppmanar användaren att ange n antal objekt.
  9. Använd en for-loop för att skapa en loopvariabel x för att iterera över objekten som användaren matat in.
  10. Läs elementen som angetts av användaren och lagra dem i arrayen.
  11. Slutet av kroppen av för slinga.
  12. Skriv ut lite text på konsolen.
  13. Använd en for-loop för att skapa en loopvariabel x för att iterera över objekten i arrayen.
  14. Skriv ut värdena som finns i arrayen med namnet arr på konsolen.
  15. Slutet på kroppen av for-slingan.
  16. Programmet måste returnera värde efter framgångsrikt slutförande.
  17. Slutet på huvuddelen av funktionen main().

OBS: I exemplet ovan får användaren ange vilken storlek som helst för arrayen under körning. Detta innebär att arrayens storlek bestäms under körning.

Initiering av dynamiskt allokerade arrayer

Det är lätt att initiera en dynamisk array till 0.

Syntax:

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

I ovanstående syntax anger längden antalet element som ska läggas till i arrayen. Eftersom vi behöver initiera arrayen till 0, bör denna lämnas tom.

Vi kan initiera en dynamisk array med hjälp av en initieringslista. Låt oss skapa ett exempel som visar detta.

Exempel 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;
}

Produktion:

Initiering av dynamiskt allokerade arrayer

Här är en skärmdump av koden:

Initiering av dynamiskt allokerade arrayer

Kodförklaring:

  1. Inkludera iostream-huvudfilen i vårt program för att använda dess funktioner.
  2. Inkludera std-namnutrymmet i vårt program för att använda dess klasser utan att anropa det.
  3. Anropa main()-funktionen. Programlogiken bör läggas till i funktionens kropp.
  4. Deklarera en heltalsvariabel med namnet x.
  5. Deklarera en dynamisk array med namnet array med hjälp av en initialiseringslista. Arrayen kommer att innehålla 5 heltalselement. Observera att vi inte har använt operatorn "=" mellan arraylängden och initialiseringslistan.
  6. Skriv ut lite text på konsolen. Änden är en C++ nyckelord som betyder slutrad. Det flyttar markören till nästa mening.
  7. Använd en for-loop för att iterera över arrayelementen.
  8. Skriv ut innehållet i arrayen med namnet array på konsolen.
  9. Slutet på kroppen av for-slingan.
  10. Programmet måste returnera värde efter framgångsrikt slutförande.
  11. Slutet på huvuddelen av funktionen main().

Ändra storlek på matriser

Längden på en dynamisk array ställs in under allokeringstiden.

Emellertid C++ har inte en inbyggd mekanism för att ändra storlek på en array när den väl har tilldelats.

Du kan dock övervinna denna utmaning genom att tilldela en ny array dynamiskt, kopiera över elementen och sedan radera den gamla arrayen.

Observera: att denna teknik är benägen att göra fel, försök därför undvika den.

Ta bort arrayer dynamiskt

En dynamisk array bör tas bort från datorns minne när dess syfte är uppfyllt. Ta bort uttalandet kan hjälpa dig att åstadkomma detta. Det frigjorda minnesutrymmet kan sedan användas för att hålla en annan uppsättning data. Men även om du inte tar bort den dynamiska arrayen från datorns minne, kommer den att raderas automatiskt när programmet avslutas.

Obs:

För att ta bort en dynamisk array från datorns minne bör du använda delete[], istället för delete. [] instruerar CPU:n att ta bort flera variabler istället för en variabel. Användningen av delete istället för delete[] när man hanterar en dynamisk array kan resultera i problem. Exempel på sådana problem är minnesläckor, datakorruption, krascher etc.

Exempel 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;
}

Produktion:

Ta bort arrayer dynamiskt

Här är en skärmdump av koden:

Ta bort arrayer dynamiskt

Kodförklaring:

  1. Inkludera iostream-huvudfilen i vårt program för att kunna använda dess funktioner.
  2. Inkludera std-namnområdet i vårt program för att kunna använda dess klasser utan att anropa det.
  3. Anropa main()-funktionen. Programlogiken bör läggas till i funktionens kropp.
  4. Deklarera två variabler x och n av heltalsdatatypen.
  5. Skriv ut lite text på konsolen. Texten kommer att be användaren att ange antalet nummer de kommer att ange.
  6. Läs användarinmatning från tangentbordet. Ingångsvärdet kommer att tilldelas variabel n.
  7. Deklarera en pekarvariabel *arr. Arrayen kommer att reservera lite minne för att lagra totalt n heltal.
  8. Skriv ut ett meddelande på konsolen som uppmanar användaren att ange n nummer.
  9. Skapa en for-loop och loopvariabeln x för att iterera över siffrorna som användaren har angett.
  10. Läs siffrorna som angetts av användaren och lagra dem i arrayen.
  11. Slutet på kroppen av for-slingan.
  12. Skriv ut lite text på konsolen.
  13. Använd en for loop och loop variabeln x för att iterera över innehållet i array arr.
  14. Skriv ut värdena för array arr på konsolen.
  15. Slutet på kroppen av for-slingan.
  16. Skriv ut en tom rad på konsolen.
  17. Frigör minnet av array-arr.
  18. Programmet kommer att returnera värde när det har slutförts framgångsrikt.
  19. Slutet på huvuddelen av funktionen main().

Sammanfattning

  • Vanliga arrayer har en fast storlek. Du kan inte ändra deras storlek när de väl har deklarerats.
  • Med dessa typer av arrayer bestäms minnesstorleken under kompileringstiden.
  • Dynamiska arrayer är olika. Deras storlekar kan ändras under körning.
  • I dynamiska arrayer bestäms storleken under körning.
  • Dynamiska arrayer i C++ deklareras med det nya nyckelordet.
  • Vi använder hakparenteser för att specificera antalet objekt som ska lagras i den dynamiska arrayen.
  • När vi är klara med arrayen kan vi frigöra minnet med hjälp av delete-operatorn.
  • Använd raderingsoperatorn med [] för att frigöra minnet för alla arrayelement.
  • En radering utan [] frigör minnet för endast ett enda element.
  • Det finns ingen inbyggd mekanism för att ändra storlek C++ arrayer.
  • För att initiera en array med en listinitierare använder vi inte operatorn "=".