Vad är en dynamisk matris?
En dynamisk matris liknar en vanlig matris, men dess storlek kan ändras under programkörning. DynamArray-element upptar ett sammanhängande minne.
När en matris har skapats kan storleken inte ändras. En dynamisk matris är dock annorlunda. En dynamisk matris 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 matris eftersom den ökar sin minnesstorlek med en viss faktor när det finns ett behov.
I den här C ++ -handledningen lär du dig
- Vad är en dynamisk matris?
- Faktorer som påverkar Dynamic Arrays prestanda
- Det nya nyckelordet
- Initierar dynamiskt tilldelade matriser
- Ändra storlek på matriser
- Radera matriser dynamiskt
Faktorer som påverkar Dynamic Arrays prestanda
Arrayens ursprungliga storlek och dess tillväxtfaktor avgör dess prestanda. Observera följande punkter:
- Om en matris har en liten storlek och en liten tillväxtfaktor kommer den att fortsätta omfördela minnet oftare. Detta minskar arrayens prestanda.
- Om en matris har en stor storlek och en stor tillväxtfaktor kommer den att ha en enorm bit av oanvänt minne. På grund av detta kan storleksändringarna ta längre tid. Detta minskar arrayens prestanda.
Det nya nyckelordet
I C ++ kan vi skapa en dynamisk matris med hjälp av det nya nyckelordet. Antalet objekt som ska tilldelas anges inom ett par hakparenteser. Typnamnet ska föregå detta. Det begärda antalet artiklar tilldelas.
Syntax:
Det nya nyckelordet har följande syntax:
pointer_variable = new data_type;
Pekaren_variabel är namnet på pekervariabeln.
Datatypen måste vara en giltig C ++ - datatyp.
Nyckelordet returnerar sedan en pekare till det första objektet. Efter att ha skapat den dynamiska matrisen kan vi radera den med hjälp av radera nyckelordet.
Exempel 1:
#includeusing 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:
Här är en skärmdump av koden:
Kodförklaring:
- Inkludera iostream-rubrikfilen i vårt program för att använda dess funktioner.
- Inkludera std-namnområdet i vårt program för att kunna använda sina klasser utan att kalla det.
- Ring huvudfunktionen (). Programlogiken ska läggas till i funktionens kropp.
- Förklara två heltalsvariabler x och n.
- Skriv ut lite text på konsolen och uppmanar användaren att ange värdet på variabeln n.
- Läs användarinmatningen från tangentbordet och tilldela den till variabel n.
- Förklara en matris som innehåller totalt n heltal och tilldela den till pekvariabel * arr.
- Skriv ut ett meddelande som uppmanar användaren att ange ett antal objekt.
- Använd en for-loop för att skapa en loop-variabel x för att itera över de objekt som användaren har angett.
- Läs elementen som användaren har angett och lagra dem i arrayarr.
- Slutet på for-loopens kropp.
- Skriv ut lite text på konsolen.
- Använd en for-loop för att skapa en loop-variabel x för att iterera över objekten i arrayen.
- Skriv ut värdena i matrisen med namnet arr på konsolen.
- Slutet på for-loopens kropp.
- Programmet måste returnera värde när det är klart.
- Slutet på huvudfunktionens () kropp.
OBS: I exemplet ovan får användaren ange vilken storlek som helst för matrisen under körtiden. Detta betyder att arrayens storlek bestäms under körning .
Initierar dynamiskt tilldelade matriser
Det är enkelt att initiera en dynamisk matris till 0.
Syntax:
int *array{ new int[length]{} };
I ovanstående syntax anger längden antalet element som ska läggas till matrisen. Eftersom vi måste initiera matrisen till 0, bör detta lämnas tomt.
Vi kan initiera en dynamisk matris med hjälp av en initialiseringslista. Låt oss skapa ett exempel som visar detta.
Exempel 2:
#includeusing 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:
Här är en skärmdump av koden:
Kodförklaring:
- Inkludera iostream-rubrikfilen i vårt program för att använda dess funktioner.
- Inkludera std-namnområdet i vårt program för att använda sina klasser utan att kalla det.
- Ring huvudfunktionen (). Programlogiken ska läggas till i funktionens kropp.
- Förklara en heltalsvariabel med namnet x.
- Förklara en dynamisk matris med namnet array med en initialiserarlista. Matrisen kommer att innehålla 5 heltalselement. Observera att vi inte har använt operatorn mellan matrislängden och initialiserarlistan.
- Skriv ut lite text på konsolen. Endl är ett C ++ nyckelord som betyder slutrad. Den flyttar markören till nästa mening.
- Använd en for-loop för att iterera över arrayelementen.
- Skriv ut innehållet i arrayen med namnet array på konsolen.
- Slutet på for-loopens kropp.
- Programmet måste returnera värde när det är klart.
- Slutet på huvudfunktionens () kropp.
Ändra storlek på matriser
Längden på en dynamisk matris ställs in under tilldelningstiden.
C ++ har dock inte en inbyggd mekanism för att ändra storlek på en array när den har tilldelats.
Du kan dock övervinna denna utmaning genom att tilldela en ny matris dynamiskt, kopiera över elementen och sedan radera den gamla matrisen.
Obs: att denna teknik är benägen för fel, försök därför att undvika den.
Radera matriser dynamiskt
En dynamisk matris bör tas bort från datorns minne när dess syfte är uppfyllt. Radera uttalandet kan hjälpa dig att uppnå 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 matrisen från datorns minne kommer den att raderas automatiskt när programmet avslutas.
Notera:
För att radera en dynamisk matris från datorns minne, bör du använda delete [] istället för delete. [] Instruerar CPU: n att ta bort flera variabler snarare än en variabel. Användningen av radera istället för radera [] när du hanterar en dynamisk matris kan leda till problem. Exempel på sådana problem är minnesläckage, datakorruption, kraschar etc.
Exempel 3:
#includeusing 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:
Här är en skärmdump av koden:
Kodförklaring:
- Inkludera iostream-rubrikfilen i vårt program för att kunna använda dess funktioner.
- Inkludera std-namnområdet i vårt program för att kunna använda sina klasser utan att kalla det.
- Ring huvudfunktionen (). Programlogiken ska läggas till i funktionens kropp.
- Deklarera två variabler x och n för heltaldatatypen.
- Skriv ut lite text på konsolen. Texten kommer att be användaren att ange antalet nummer de kommer att ange.
- Läs användarinmatningen från tangentbordet. Ingångsvärdet tilldelas variabeln n.
- Förklara en pekervariabel * arr. Array arr kommer att reservera lite minne för att lagra totalt n heltal.
- Skriv ut ett meddelande på konsolen där du uppmanas att ange n-nummer.
- Skapa en for-loop och loop-variabeln x för att itera över de siffror som användaren har angett.
- Läs de siffror som användaren har angett och lagra dem i arrayarr.
- Slutet på for-loopens kropp.
- Skriv ut lite text på konsolen.
- Använd en for-loop och loop-variabeln x för att iterera över innehållet i array arr.
- Skriv ut värdena för array arr på konsolen.
- Slutet på for-loopens kropp.
- Skriv ut en tom rad på konsolen.
- Frigör minnet för arrayen arr.
- Programmet returnerar värde när det är klart.
- Slutet på huvudfunktionens () kropp.
Sammanfattning:
- Vanliga matriser har en fast storlek. Du kan inte ändra deras storlek när deklareras.
- Med dessa typer av matriser bestäms minnesstorleken under kompileringstiden.
- Dynamiska matriser är olika. Deras storlekar kan ändras under körning.
- I dynamiska matriser bestäms storleken under körning.
- Dynamiska matriser i C ++ deklareras med hjälp av det nya nyckelordet.
- Vi använder hakparenteser för att ange antalet objekt som ska lagras i den dynamiska matrisen.
- När du är klar med matrisen kan vi frigöra minnet med hjälp av borttagningsoperatören.
- Använd raderaoperatören med [] för att frigöra minnet för alla matriselement.
- En radering utan [] frigör minnet av endast ett enda element.
- Det finns ingen inbyggd mekanism för att ändra storlek på C ++ - matriser.
- För att initialisera en matris med hjälp av en listinitierare använder vi inte operatören .