C++ Dynamisk tildeling av matriser med eksempel

Hva er en Dynamic Array?

En dynamisk matrise er ganske lik en vanlig matrise, men størrelsen kan endres under programkjøring. DynamArray-elementer opptar en sammenhengende minneblokk.

Når en matrise er opprettet, kan ikke størrelsen endres. En dynamisk matrise er imidlertid annerledes. En dynamisk matrise kan utvide størrelsen selv etter at den er fylt.

Under opprettelsen av en matrise blir den tildelt en forhåndsbestemt mengde minne. Dette er ikke tilfellet med en dynamisk array da den øker minnestørrelsen med en viss faktor når det er behov.

Faktorer som påvirker ytelsen til Dynamic Arrays

Arrayens opprinnelige størrelse og vekstfaktor bestemmer ytelsen. Legg merke til følgende punkter:

  1. Hvis en matrise har en liten størrelse og en liten vekstfaktor, vil den fortsette å omfordele minne oftere. Dette vil redusere ytelsen til matrisen.
  2. Hvis en matrise har en stor størrelse og en stor vekstfaktor, vil den ha en stor del av ubrukt minne. På grunn av dette kan det ta lengre tid å endre størrelse. Dette vil redusere ytelsen til matrisen.

Det nye nøkkelordet

In C++, kan vi lage en dynamisk matrise ved å bruke det nye nøkkelordet. Antall elementer som skal tildeles er spesifisert innenfor et par firkantede parenteser. Typenavnet skal gå foran dette. Det forespurte antallet varer vil bli tildelt.

syntax

Det nye nøkkelordet har følgende syntaks:

pointer_variable = new data_type;

Pointer_variable er navnet på pekervariabel.

Data_type må være en gyldig C++ data-type.

Nøkkelordet returnerer deretter en peker til det første elementet. Etter å ha opprettet den dynamiske matrisen, kan vi slette den ved å bruke nøkkelordet delete.

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

Utgang:

Det nye nøkkelordet

Her er et skjermbilde av koden:

Det nye nøkkelordet

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet vårt for å bruke den funksjoner.
  2. Inkluder std-navneområdet i programmet vårt for å bruke klassene uten å kalle det.
  3. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av funksjonen.
  4. Deklarer to heltallsvariabler x og n.
  5. Skriv ut litt tekst på konsollen som ber brukeren om å angi verdien av variabel n.
  6. Les brukerinndata fra tastaturet og tilordne det til variabel n.
  7. Erklær en matrise til å inneholde totalt n heltall og tilordne den til pekervariabelen *arr.
  8. Skriv ut en melding som ber brukeren om å angi n antall elementer.
  9. Bruk en for-løkke for å lage en løkkevariabel x for å iterere over elementene som er angitt av brukeren.
  10. Les elementene som er lagt inn av brukeren og lagre dem i array arr.
  11. Slutten av kroppen til for sløyfe.
  12. Skriv ut litt tekst på konsollen.
  13. Bruk en for-løkke for å lage en løkkevariabel x for å iterere over elementene i matrisen.
  14. Skriv ut verdiene i matrisen kalt arr på konsollen.
  15. Enden av kroppen til for-løkken.
  16. Programmet må returnere verdi ved vellykket gjennomføring.
  17. Slutten av hoveddelen av hoved()-funksjonen.

MERK: I eksemplet ovenfor har brukeren lov til å spesifisere hvilken som helst størrelse for matrisen under kjøretiden. Dette betyr at matrisens størrelse bestemmes under kjøring.

Initialisere dynamisk tildelte arrays

Det er enkelt å initialisere en dynamisk matrise til 0.

Syntaks:

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

I syntaksen ovenfor angir lengden antall elementer som skal legges til matrisen. Siden vi må initialisere matrisen til 0, bør denne stå tom.

Vi kan initialisere en dynamisk matrise ved å bruke en initialiseringsliste. La oss lage et eksempel som 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;
}

Utgang:

Initialisere dynamisk tildelte arrays

Her er et skjermbilde av koden:

Initialisere dynamisk tildelte arrays

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet vårt for å bruke funksjonene.
  2. Inkluder std-navneområdet i programmet vårt for å bruke klassene uten å kalle det.
  3. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av funksjonen.
  4. Deklarer en heltallsvariabel kalt x.
  5. Erklær en dynamisk matrise kalt matrise ved hjelp av en initialiseringsliste. Matrisen vil inneholde 5 heltallselementer. Merk at vi ikke har brukt "="-operatoren mellom arraylengden og initialiseringslisten.
  6. Skriv ut litt tekst på konsollen. Endl er en C++ nøkkelord som betyr sluttlinje. Den flytter markøren til neste setning.
  7. Bruk en for-løkke for å iterere over array-elementene.
  8. Skriv ut innholdet i arrayen med navnet array på konsollen.
  9. Enden av kroppen til for-løkken.
  10. Programmet må returnere verdi ved vellykket gjennomføring.
  11. Slutten av hoveddelen av hoved()-funksjonen.

Endre størrelse på matriser

Lengden på en dynamisk matrise settes i løpet av allokeringstiden.

Imidlertid C++ har ikke en innebygd mekanisme for å endre størrelse på en matrise når den har blitt tildelt.

Du kan imidlertid overvinne denne utfordringen ved å tildele en ny matrise dynamisk, kopiere over elementene og deretter slette den gamle matrisen.

Merk: at denne teknikken er utsatt for feil, prøv derfor å unngå den.

Dynamisk sletting av matriser

En dynamisk matrise bør slettes fra datamaskinens minne når formålet er oppfylt. Sletterklæringen kan hjelpe deg med å oppnå dette. Den frigjorte minneplassen kan deretter brukes til å holde et annet sett med data. Men selv om du ikke sletter den dynamiske matrisen fra datamaskinens minne, vil den bli slettet automatisk når programmet avsluttes.

OBS:

For å slette en dynamisk matrise fra datamaskinens minne, bør du bruke delete[], i stedet for delete. [] instruerer CPU-en til å slette flere variabler i stedet for én variabel. Bruken av delete i stedet for delete[] når du arbeider med en dynamisk matrise kan føre til problemer. Eksempler på slike problemer inkluderer minnelekkasjer, datakorrupsjon, krasjer 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;
}

Utgang:

Dynamisk sletting av matriser

Her er et skjermbilde av koden:

Dynamisk sletting av matriser

Kodeforklaring:

  1. Inkluder iostream-headerfilen i programmet vårt for å bruke funksjonene.
  2. Inkluder std-navneområdet i programmet vårt for å bruke klassene uten å kalle det.
  3. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av funksjonen.
  4. Deklarer to variabler x og n av heltallsdatatypen.
  5. Skriv ut litt tekst på konsollen. Teksten vil be brukeren om å oppgi antall tall de skal taste inn.
  6. Les brukerinndata fra tastaturet. Inngangsverdien vil bli tilordnet variabel n.
  7. Deklarer en pekervariabel *arr. Matrisen arr vil reservere noe minne for å lagre totalt n heltall.
  8. Skriv ut en melding på konsollen som ber brukeren om å skrive inn n tall.
  9. Lag en for-løkke og loop-variabelen x for å iterere over tallene som er angitt av brukeren.
  10. Les tallene som er lagt inn av brukeren og lagre dem i array arr.
  11. Enden av kroppen til for-løkken.
  12. Skriv ut litt tekst på konsollen.
  13. Bruk en for loop og loop-variabelen x for å iterere over innholdet i array arr.
  14. Skriv ut verdiene til array arr på konsollen.
  15. Enden av kroppen til for-løkken.
  16. Skriv ut en tom linje på konsollen.
  17. Frigjør minnet til array arr.
  18. Programmet vil returnere verdi når det er fullført.
  19. Slutten av hoveddelen av hoved()-funksjonen.

Sammendrag

  • Vanlige arrays har en fast størrelse. Du kan ikke endre størrelsen deres når de er deklarert.
  • Med disse typene arrays bestemmes minnestørrelsen under kompileringstiden.
  • Dynamiske arrays er forskjellige. Størrelsene deres kan endres under kjøring.
  • I dynamiske matriser bestemmes størrelsen under kjøring.
  • Dynamiske arrays i C++ er deklarert med det nye nøkkelordet.
  • Vi bruker firkantede parenteser for å spesifisere antall elementer som skal lagres i den dynamiske matrisen.
  • Når vi er ferdige med matrisen, kan vi frigjøre minnet ved å bruke sletteoperatoren.
  • Bruk delete-operatoren med [] for å frigjøre minnet til alle matriseelementer.
  • En sletting uten [] frigjør minnet til bare ett enkelt element.
  • Det er ingen innebygd mekanisme for å endre størrelse C++ matriser.
  • For å initialisere en matrise ved hjelp av en listeinitialiserer, bruker vi ikke "="-operatoren.

Les mer Readmore