Ce este o matrice dinamică?
O matrice dinamică este destul de asemănătoare cu o matrice obișnuită, dar dimensiunea sa poate fi modificată în timpul rulării programului. Elementele DynamArray ocupă un bloc contiguu de memorie.
Odată ce un tablou a fost creat, dimensiunea acestuia 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 prestabilită de memorie. Nu este cazul cu o matrice dinamică, deoarece își mărește dimensiunea memoriei cu un anumit factor atunci când este nevoie.
În acest tutorial C ++, veți învăța
- Ce este o matrice dinamică?
- Factori care afectează performanța matricelor dinamice
- Noul cuvânt cheie
- Inițializarea matricelor alocate dinamic
- Redimensionarea matricilor
- Ștergerea dinamic a matricelor
Factori care afectează 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ă un tablou are o dimensiune mică și un factor de creștere mic, acesta va continua să realoce mai des memoria. Acest lucru va reduce performanța matricei.
- Dacă o matrice are o dimensiune mare și un factor de creștere mare, va avea o mare parte din memoria neutilizată. Datorită acestui fapt, operațiunile de redimensionare pot dura mai mult. Acest lucru va reduce performanța matricei.
Noul cuvânt cheie
În C ++, putem crea o matrice dinamică folosind noul cuvânt cheie. Numărul de elemente care urmează să fie alocate este specificat într-o pereche de paranteze drepte. Numele tipului ar trebui să preceadă acest lucru. Numărul solicitat de articole va fi alocat.
Sintaxă:
Noul cuvânt cheie are următoarea sintaxă:
pointer_variable = new data_type;
Pointer_variable este numele variabilei pointer.
Data_type trebuie să fie un tip de date C ++ valid.
Cuvântul cheie returnează apoi un pointer la primul element. După crearea matricei dinamice, o putem șterge folosind cuvântul cheie ștergere.
Exemplul 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;}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includeți fișierul antet iostream în programul nostru pentru a-i folosi funcțiile.
- 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 trebuie adăugată în corpul funcției.
- Declarați două variabile întregi x și n.
- Imprimați un text pe consolă, solicitând utilizatorului să introducă valoarea variabilei n.
- Citiți informațiile utilizatorului de la tastatură și atribuiți-le variabilei n.
- Declarați o matrice pentru a conține un total de n numere întregi și atribuirea variabilei pointer * arr.
- Imprimați un mesaj prin care solicitați utilizatorului să introducă un număr de articole.
- Utilizați o buclă for pentru a crea o variabilă de buclă x pentru a itera peste elementele introduse de utilizator.
- Citiți elementele introduse de utilizator și stocați-le în matricea arr.
- Sfârșitul corpului buclei for.
- Imprimați un text pe consolă.
- Utilizați o buclă for pentru a crea o variabilă de buclă x pentru a itera peste elementele matricei.
- Imprimați valorile conținute în matricea numită arr pe consolă.
- Sfârșitul corpului buclei for.
- Programul trebuie să returneze valoarea la finalizarea cu succes.
- Sfârșitul corpului funcției main ().
NOTĂ: În exemplul de mai sus, utilizatorul are permisiunea de a specifica 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 matricei. Deoarece trebuie să inițializăm matricea la 0, aceasta ar trebui lăsată goală.
Putem inițializa o matrice dinamică folosind o listă de inițializatoare. Să creăm un exemplu care să demonstreze acest lucru.
Exemplul 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;}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includeți fișierul antet iostream în programul nostru pentru a-i folosi funcțiile.
- 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 trebuie adăugată în corpul funcției.
- Declarați o variabilă întreagă numită x.
- Declarați o matrice dinamică numită matrice utilizând o listă de inițializatoare. Matricea va conține 5 elemente întregi. Rețineți că nu am folosit operatorul între lungimea matricei și lista de inițializatoare.
- Imprimați un text pe consolă. Endl este un cuvânt cheie C ++ care înseamnă linie finală. Mută cursorul la următoarea propoziție.
- Utilizați o buclă for pentru a itera peste elementele matricei.
- Imprimați conținutul matricei numită matrice pe consolă.
- Sfârșitul corpului buclei for.
- Programul trebuie să returneze valoarea la finalizarea cu succes.
- Sfârșitul corpului funcției main ().
Redimensionarea matricilor
Lungimea unei matrice dinamice este setată în timpul alocării.
Cu toate acestea, C ++ nu are un mecanism încorporat de redimensionare a unui tablou odată ce a fost alocat.
Cu toate acestea, puteți depăși această provocare prin alocarea dinamică a unei noi matrici, copierea elementelor, apoi ștergerea matricei vechi.
Notă: această tehnică este predispusă la erori, prin urmare, încercați să o evitați.
Ștergerea dinamic a matricelor
O matrice dinamică ar trebui ș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 după terminarea programului.
Notă:
Pentru a șterge o matrice dinamică din memoria computerului, ar trebui să utilizați ștergeți [], în loc să ștergeți. [] Instruiește CPU să șteargă mai multe variabile decât o singură variabilă. Utilizarea ștergerii în loc de ștergerea [] 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, corupție de date, blocări etc.
Exemplul 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;}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includeți fișierul antet iostream în programul nostru pentru a-i folosi funcțiile.
- 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 trebuie adăugată în corpul funcției.
- Declarați două variabile x și n ale tipului de date întregi.
- Imprimați un text pe consolă. Textul va cere utilizatorului să precizeze numărul de numere pe care le va introduce.
- Citiți informațiile 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.
- Imprimați un mesaj pe consolă prin care solicitați utilizatorului să introducă n numere.
- Creați o buclă for și variabila buclei x pentru a itera peste numerele introduse de utilizator.
- Citiți numerele introduse de utilizator și stocați-le în matricea arr.
- Sfârșitul corpului buclei for.
- Imprimați un text pe consolă.
- Utilizați o buclă for și variabila buclei x pentru a itera pe conținutul matricei arr.
- Imprimați valorile matricei arr de pe consolă.
- Sfârșitul corpului buclei for.
- Imprimaț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:
- Tablourile obișnuite au o dimensiune fixă. Nu le puteți modifica dimensiunea odată declarată.
- Cu aceste tipuri de tablouri, dimensiunea memoriei este determinată în timpul compilării.
- Tablourile dinamice sunt diferite. Dimensiunile lor pot fi modificate în timpul rulării.
- În tablourile dinamice, dimensiunea este determinată în timpul rulării.
- Tablourile dinamice din C ++ sunt declarate folosind noul cuvânt cheie.
- Folosim paranteze pătrate pentru a specifica numărul de articole care trebuie stocate în matricea dinamică.
- Odată ce ați terminat cu matricea, putem elibera memoria folosind operatorul de ștergere.
- Utilizați operatorul de ștergere cu [] pentru a elibera memoria tuturor elementelor matrice.
- O ștergere fără [] eliberează memoria doar a unui singur element.
- Nu există un mecanism încorporat pentru a redimensiona matricele C ++.
- Pentru a inițializa o matrice utilizând un inițializator de listă, nu folosim operatorul .