Ce sunt matricele dinamice ale C ++?

Să definim începutul cu ceea ce este o matrice dinamică. De la vremurile lui C, există matrice, dar caracteristica lor a fost o dimensiune fixă, care a fost specificată la creație și nu sa mai schimbat. Din această cauză ele sunt numite matrice statice. Evident, o matrice dinamică înseamnă că își poate schimba dimensiunea în timpul programului. Și, de asemenea, poate fi creat atunci când numărul presupuselor elemente este chiar aproximativ necunoscut, adică gol.

Managementul memoriei dinamice

Alocarea memoriei în heap

Există un astfel de lucru, cum ar fi gestionarea dinamică a memoriei. Această abordare a programării vă permite să utilizați memoria calculatorului cât mai eficient posibil. În C ++, acest proces este controlat de operațiile noi și de ștergere. Operarea noii memorii de rezervă în zona de memorie dinamică sau numită, de asemenea, o grămadă (magazin gratuit sau heap în engleză). În consecință, operația de ștergere eliberează rezervarea.

Prin standardele de programare, memoria dinamică trebuie monitorizată și eliminată în timp util, astfel încât operațiile noi și ștergerea sunt adesea folosite în perechi. Acest principiu a fost mult depășit. Rădăcinile sale au crescut din momentul în care sistemele de operare nu au urmat bine memoria sau pur și simplu nu au știut cum să o curățe singură. Acum sistemul de operare șterge întotdeauna memoria după ce se execută programul. Cu toate acestea, curățarea explicită a memoriei este un semn al unui ton bun în programare.

Operația memorează noua rezervă pentru un obiect de un anumit tip și returnează o adresă în memorie. Dacă alocarea memoriei este imposibilă dintr-un anumit motiv, operația returnează un pointer nul (un indicator care nu se referă la nimic) și aruncă o excepție. Noul operator lucrează cu obiecte de orice tip de date: dublu, caractere, int, etc. Alocarea memoriei și ștergerea acesteia arată astfel.

	int * p = new int- // * - înseamnă că variabila este un pointer. Pointerii stochează adresele. * P = 9-șterge p-

Suprafață unidimensională

Crearea unei matrice dinamice unidimensionale este aceeași cu crearea unei variabile pe heap.

	dublu * a = noul dublu [10] - // a este un pointer la memoria alocată unei matrice de 10 elemente de tip doublea [5] = 2.5-delete [] a- // fi atent la această construcție! E viclenia!

După instrucțiunea de ștergere, trebuie să specificați paranteze pătrate, pentru a desemna pentru program viitoarea operație ca eliberarea nu numai a pointerului la matrice, ci și a matricei în sine.

Suprafață bidimensională

Crearea unei matrice dinamice unidimensionale este o sarcină trivială. Și dacă avem nevoie de o gamă multidimensională ...

	dublu ** ma = nou dublu * [5] - // pas 1 pentru (int I = 0-I < 5- i ++) // etapa 2ma [i] = noul dublu [10] -

Astfel, o matrice dinamică este creată în C ++ cu o dimensiune de 5 la 10. Aceasta înseamnă literalmente, la prima etapă, alocarea unei matrice de 5 elemente în memorie. Apoi, în al doilea pas, alocarea memoriei pentru o serie de 10 elemente și scrierea adresei în matricea anterioară, și astfel pentru fiecare coloană.

Banda dinamică bidimensională

De ce este folosit un pointer de ordinul doi? Acesta este un indicator pentru pointer. Este un pic dificil de înțeles. Deși codul ne spune literalmente să ajungem la o valoare stocată în matrice, trebuie să mergem la adresă, să ajungem acolo o adresă și apoi să ieșim la valoare.

Amintiți-vă că a fost necesar să vă amintiți designul de delimitare a memoriei pentru matrice? O matrice bidimensională este distrusă după cum urmează.

	pentru (int I = 0-i < 5l i ++) ștergeți [] ma [i] - // se pare că am uitat cevahelhellip-delete [] ma-

Acum puteți crea cu ușurință chiar și o matrice de cinci dimensiuni.

Unde este "dinamica"?

La început sa spus că dimensiunea matricei dinamice se modifică în timpul programului, dar în exemplele de mai sus, nicăieri nu a fost indicată explicit. Schimbările în dimensionalitatea matricei se fac folosind următorul algoritm:

  1. O gamă nouă de dimensiuni necesare este creată în memorie.
  2. Datele matricei vechi sunt suprascrise în noua matrice.
  3. Vechea matrice este distrusă.

Vector STL - o nouă matrice dinamică

Pentru a utiliza vectori, trebuie să vă conectați .

După cum știți, biblioteca de șabloane standard (STL) este echipată cu un set de containere care gestionează colecțiile de elemente. Printre containere sunt containere consecutive. Ele diferă în principal prin ordonarea elementelor prin timpul de inserție. Cu alte cuvinte, primul element va fi întotdeauna primul, cel de-al doilea întotdeauna cel de-al doilea și așa mai departe. Există și alte tipuri de containere - asociative, ordonate după valoarea elementelor și neordonate deloc.



Un astfel de container consecutiv este un vector. Administrează elementele matricei C ++ în memorie dinamică. Accesul la aceste elemente se face direct pe index. Datorită faptului că vectorul este un container secvențial, elementele de adăugare și eliminare apar la sfârșitul matricei și aceste operații sunt executate foarte rapid. Cu toate acestea, inserarea unui element nou în mijlocul sau la începutul unui vector este mult mai lentă, deoarece pentru a efectua această procedură va trebui să mutați toate elementele anterioare la numărul de inserare curent. Să luăm în considerare un exemplu.

#include #include int main () {std :: vector v- // crea un vector gol pentru stocarea elementelor de tip int // definitia unui vector este un template al spatiului std, deci std :: pentru (int i = 0- i <= 5 ++ i) {v.push_back (i) -} pentru (int i = 0-i < v.size () - ++ i) {std :: cout << v [i] << "," - "std :: cout << std :: endl-system ("pauză") -}

După cum puteți vedea din cod, lucrul cu vectorii este exact același ca și cu matricea. În acest caz, vectorii sunt furnizați cu proprietăți suplimentare utile, cum ar fi funcțiile C ++ pentru matricele dinamice .size () și .push_back (). Strict vorbind, aceste funcții membre aparțin containerului.

Adăugarea unui element vector

Accesul la elemente vectoriale

Accesarea elementelor vectoriale este un subiect despre care ar trebui să vorbiți separat. Există următoarele moduri de a vă referi la elementele unui vector.

V [index]

Referința indicelui standard

V.at (index)

Referindu-se la un element prin index, dar dacă depășiți intervalul, o excepție este aruncată

V.front ()

Referindu-se la primul element al unui vector

V.back ()

Referindu-se la ultimul element al vectorului

Evident, modul cel mai precis de a accesa un element vectorial este de a apela funcția .at (), deoarece generează o excepție out_of_range care poate fi procesată într-un bloc try-catch. Funcționarea [] și funcțiile .front () și .back () funcționează într-o manieră imprevizibilă, dacă sunt în afara domeniului.

Vector vectorial

Luați în considerare exemplul de a crea o dinamică matrice bidimensională C ++ - simplu matrice 5 de 5.

Schema mn-matrice
 vector< vector > v (5, vector(5)) -v [2] [3] = 10-int a = v [2] [3] -v [2] .Push_back (5) - // crea un nou element la sfîrșitul vectorului [ ) - // șterge ultimul element

Un vector bidimensional este un vector de vectori. Și cu fiecare vector individual puteți lucra: adăugați și eliminați elemente, utilizați funcțiile membrilor, așa cum se arată în exemplul de mai sus în ultima linie. De asemenea, puteți utiliza iteratori. La prima vedere, construcția pare a fi înfricoșătoare. Dar numai la început. Vectorii sunt mult mai puternici decât cei descriși în acest articol. Acestea pot fi consultate în detaliu în documentație.

Ștergerea unui element vector

concluzie

În ultimul timp, programatorii au trebuit să creeze ei înșiși dinamici, inclusiv toate funcțiile și algoritmii necesare pentru a lucra cu ei. Dar odată cu apariția STL, ei pot folosi clase pregătite, grijulii și eficiente. Prin urmare, nu trebuie să reinventezi din nou roata, ci pur și simplu să folosești vectori (sau alt container adecvat). Și numai dacă este necesar, lucrați cu metode vechi.

Distribuiți pe rețelele sociale:

înrudit
Care este mai bine: CCD sau CMOS? Criterii de selecțieCare este mai bine: CCD sau CMOS? Criterii de selecție
Mijloacele Java de șiruri de caractere. Sortarea unui matrice în Java. Dispozitiv Java de două…Mijloacele Java de șiruri de caractere. Sortarea unui matrice în Java. Dispozitiv Java de două…
Matricea jаvascript și crearea acesteia. Totul despre matricea de jаvascriptMatricea jаvascript și crearea acesteia. Totul despre matricea de jаvascript
Arrays sunt ... O scurtă introducere la subiectArrays sunt ... O scurtă introducere la subiect
Bucle eficiente de foreach: PHP și mese regulateBucle eficiente de foreach: PHP și mese regulate
Java Array. Arrays în Java. Java pentru începătoriJava Array. Arrays în Java. Java pentru începători
jаvascript Array pentru a stoca un număr nelimitat de variabilejаvascript Array pentru a stoca un număr nelimitat de variabile
Disk arrays RAID: ce este și pentru ce?Disk arrays RAID: ce este și pentru ce?
Cum de a face o ip dinamic și ce este pentru ea?Cum de a face o ip dinamic și ce este pentru ea?
Proprietățile matricei și determinantul acesteiaProprietățile matricei și determinantul acesteia
» » Ce sunt matricele dinamice ale C ++?