C++ Dynamisk tildeling av matriser med eksempel

⚡ Smart oppsummering

C++ Dynamisk allokering av arrayer forklarer hvordan du allokerer, endrer størrelse på og sletter arrayer på heapen under kjøretid. Lessons dekker nye, slette[], initialisering, kopiering, endring av størrelse og sikre minnemønstre.

  • 🧠 Heapallokering: new int[size] oppretter arrayer med kjent størrelse under kjøring.
  • 🔁 initialisering: new int[size](){} nuller i minnet; parenteslister setter faste verdier.
  • 📏 Endring av størrelse: Alloker større, kopier med std::copy, og slett deretter den gamle bufferen.
  • 🧹 Slett riktig: Kall alltid delete[] på arrayer; aldri ren sletting.
  • 📦 Foretrekker std::vector: Moderne C++ favoriserer vektor for automatisk endring av størrelse og RAII.
  • 🤖 AI Revse: AI-assistenter oppdager lekkasjer og foreslår smarte pekere.

C++ Dynamisk tildeling av matriser

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

Code Forklaring:

  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

Code Forklaring:

  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

Code Forklaring:

  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.

Spørsmål og svar

Størrelse på statiske arrayer ved kompileringstid på stakken. Størrelse på dynamiske arrayer ved kjøretid på heapen.

AI-verktøy oppdager lekkasjer, manglende delete[] og foreslår unique_ptr- eller vektorerstatninger.

Ja. Copilot refaktorerer rå nye og slettede filer til std::vector eller smarte pekere.

Alloker større, kopier med std::copy, slett[] den gamle bufferen, eller bruk std::vector.

delete[] kjører destruktorer og frigjør blokken. Ren sletting på arrayer er udefinert oppførsel.

Bruk den som standard. Den administrerer minne, støtter endring av størrelse, områdeløkker og unntak på en sikker måte.

Nei. SyncKronisere allokering, tilgang og sletting med mutexer eller atomics.

Bruk std::vector eller std::unique_ptr for å unngå manuell sletting[].

Oppsummer dette innlegget med: