C++ Alocarea dinamică a tablourilor cu exemplu
Ce este o matrice dinamică?
O matrice dinamică este destul de similară cu o matrice obișnuită, dar dimensiunea sa este modificabilă în timpul rulării programului. Elementele DynamArray ocupă un bloc contigu de memorie.
Odată ce o matrice a fost creată, dimensiunea acesteia nu poate fi modificată. Cu toate acestea, o matrice dinamică este diferită. O matrice dinamică își poate extinde dimensiunea chiar și după ce a fost umplută.
În timpul creării unei matrice, i se alocă o cantitate predeterminată de memorie. Acesta nu este cazul unei matrice dinamice, deoarece își crește dimensiunea memoriei cu un anumit factor atunci când este nevoie.
Factori care influențează performanța matricelor dinamice
Dimensiunea inițială a matricei și factorul de creștere determină performanța acesteia. Rețineți următoarele puncte:
- Dacă o matrice are o dimensiune mică și un factor de creștere mic, va continua să realoceze memoria mai des. Acest lucru va reduce performanța matricei.
- Dacă o matrice are o dimensiune mare și un factor de creștere mare, va avea o bucată uriașă de memorie nefolosită. Din acest motiv, operațiunile de redimensionare pot dura mai mult. Acest lucru va reduce performanța matricei.
Noul cuvânt cheie
In C++, putem crea o matrice dinamică folosind cuvântul cheie nou. Numărul de articole care urmează să fie alocate este specificat între o pereche de paranteze drepte. Numele tipului ar trebui să preceadă. Numărul de articole solicitat va fi alocat.
Sintaxă
Noul cuvânt cheie are următoarea sintaxă:
pointer_variable = new data_type;
Variabila_pointer este numele variabila pointer.
Data_type trebuie să fie valid C++ tipul de date.
Cuvântul cheie returnează apoi un indicator la primul element. După crearea matricei dinamice, îl putem șterge folosind cuvântul cheie delete.
Exemplu 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; }
ieșire:
Iată o captură de ecran a codului:
Explicația codului:
- Includeți fișierul antet iostream în programul nostru pentru a-l folosi funcții.
- Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
- Apelați funcția main(). Logica programului ar trebui adăugată în corpul funcției.
- Declarați două variabile întregi x și n.
- Tipăriți un text pe consolă, solicitând utilizatorului să introducă valoarea variabilei n.
- Citiți intrarea utilizatorului de la tastatură și atribuiți-o variabilei n.
- Declarați o matrice care să conțină un total de n numere întregi și atribuirea acesteia variabilei pointer *arr.
- Imprimați un mesaj care solicită utilizatorului să introducă un număr de n articole.
- Utilizați o buclă for pentru a crea o variabilă de buclă x pentru a itera elementele introduse de utilizator.
- Citiți elementele introduse de utilizator și stocați-le în matricea arr.
- Capătul corpului pentru bucla.
- Tipăriți ceva text pe consolă.
- Utilizați o buclă for pentru a crea o variabilă de buclă x pentru a repeta peste elementele matricei.
- Tipăriți valorile conținute în matricea numită arr pe consolă.
- Capătul corpului buclei for.
- Programul trebuie să returneze valoare după finalizarea cu succes.
- Sfârșitul corpului funcției main().
NOTĂ: În exemplul de mai sus, utilizatorului i se permite să specifice orice dimensiune pentru matrice în timpul rulării. Aceasta înseamnă că dimensiunea matricei este determinată în timpul rulării.
Inițializarea matricelor alocate dinamic
Este ușor să inițializați o matrice dinamică la 0.
Sintaxă:
int *array{ new int[length]{} };
În sintaxa de mai sus, lungimea indică numărul de elemente care trebuie adăugate la matrice. Deoarece trebuie să inițializam matricea la 0, aceasta ar trebui lăsată goală.
Putem inițializa o matrice dinamică folosind o listă de inițializare. Să creăm un exemplu care să demonstreze acest lucru.
Exemplu 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; }
ieșire:
Iată o captură de ecran a codului:
Explicația codului:
- Includeți fișierul antet iostream în programul nostru pentru a utiliza funcțiile acestuia.
- Includeți spațiul de nume std în programul nostru pentru a-i folosi clasele fără a-l apela.
- Apelați funcția main(). Logica programului ar trebui adăugată în corpul funcției.
- Declarați o variabilă întreagă numită x.
- Declarați o matrice dinamică numită matrice folosind o listă de inițializare. Matricea va conține 5 elemente întregi. Rețineți că nu am folosit operatorul „=" între lungimea matricei și lista de inițializare.
- Imprimați ceva text pe consolă. Sfârșitul este a C++ cuvânt cheie care înseamnă linia finală. Mută cursorul la următoarea propoziție.
- Utilizați o buclă for pentru a itera elementele matricei.
- Tipăriți conținutul matricei numită matrice pe consolă.
- Capătul corpului buclei for.
- Programul trebuie să returneze valoare după finalizarea cu succes.
- Sfârșitul corpului funcției main().
Redimensionarea tablourilor
Lungimea unui tablou dinamic este setată în timpul de alocare.
"Dar daca C++ nu are un mecanism încorporat de redimensionare a unei matrice odată ce aceasta a fost alocată.
Puteți, totuși, să depășiți această provocare prin alocarea dinamică a unei noi matrice, copierea elementelor, apoi ștergerea matricei vechi.
Notă: că această tehnică este predispusă la erori, prin urmare, încercați să o evitați.
Ștergerea dinamică a tablourilor
O matrice dinamică ar trebui să fie ștearsă din memoria computerului odată ce scopul său este îndeplinit. Declarația de ștergere vă poate ajuta să realizați acest lucru. Spațiul de memorie eliberat poate fi apoi utilizat pentru a păstra un alt set de date. Cu toate acestea, chiar dacă nu ștergeți matricea dinamică din memoria computerului, aceasta va fi ștearsă automat odată ce programul se încheie.
Notă:
Pentru a șterge o matrice dinamică din memoria computerului, ar trebui să utilizați delete[], în loc de ștergere. [] indică procesorului să șteargă mai multe variabile, mai degrabă decât o singură variabilă. Utilizarea ștergere în loc de ștergere[] atunci când aveți de-a face cu o matrice dinamică poate duce la probleme. Exemple de astfel de probleme includ scurgeri de memorie, coruperea datelor, blocări etc.
Exemplu 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; }
ieșire:
Iată o captură de ecran a codului:
Explicația codului:
- Includeți fișierul antet iostream în programul nostru pentru a utiliza funcțiile acestuia.
- Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
- Apelați funcția main(). Logica programului ar trebui adăugată în corpul funcției.
- Declarați două variabile x și n ale tipului de date întreg.
- Tipăriți ceva text pe consolă. Textul va cere utilizatorului să precizeze numărul de numere pe care le va introduce.
- Citiți intrarea utilizatorului de la tastatură. Valoarea de intrare va fi atribuită variabilei n.
- Declarați o variabilă pointer *arr. Matricea arr va rezerva ceva memorie pentru a stoca un total de n numere întregi.
- Tipăriți un mesaj pe consolă care solicită utilizatorului să introducă n numere.
- Creați o buclă for și variabila buclă x pentru a repeta peste numerele introduse de utilizator.
- Citiți numerele introduse de utilizator și stocați-le în matricea arr.
- Capătul corpului buclei for.
- Tipăriți ceva text pe consolă.
- Utilizați o buclă for și variabila buclă x pentru a itera conținutul matricei arr.
- Tipăriți valorile matricei arr pe consolă.
- Capătul corpului buclei for.
- Tipăriți o linie goală pe consolă.
- Eliberați memoria matricei arr.
- Programul va returna valoarea când se va finaliza cu succes.
- Sfârșitul corpului funcției main().
Rezumat
- Matricele obișnuite au o dimensiune fixă. Nu le puteți modifica dimensiunea odată declarată.
- Cu aceste tipuri de matrice, dimensiunea memoriei este determinată în timpul compilării.
- Matricele dinamice sunt diferite. Dimensiunile lor pot fi modificate în timpul rulării.
- În matricele dinamice, dimensiunea este determinată în timpul rulării.
- Matrice dinamice în C++ sunt declarate folosind cuvântul cheie nou.
- Folosim paranteze pătrate pentru a specifica numărul de elemente care vor fi stocate în matricea dinamică.
- Odată terminat cu matricea, putem elibera memoria folosind operatorul de ștergere.
- Utilizați operatorul de ștergere cu [] pentru a elibera memoria tuturor elementelor matricei.
- O ștergere fără [] eliberează memoria doar a unui singur element.
- Nu există niciun mecanism încorporat de redimensionare C++ matrici.
- Pentru a inițializa o matrice folosind un inițializator de listă, nu folosim operatorul „=”.