Când să folosim vectori și când să folosim matrice în C ++?

De obicei, nu sunt sigur când este mai bine să folosiți una față de cealaltă. Ambele par să facă aceleași lucruri în general, dar vectorul este mai flexibil în ceea ce privește ceea ce poate face? Când sunt mai potrivite matricele?

0
Aproape niciodată nu folosesc matricea este sugestia mea. Dar, prin matrice, vrei sa spui type [] sau std :: array ?
adăugat autor Richard J. Ross III, sursa
@ Tip RichardJ.RossIII []
adăugat autor John Smith, sursa
Principala diferență dintre un vector și o matrice, într-un sens C ++, este că vectorii fac gestionarea automată a memoriei dinamice, în timp ce matricele sunt fixate.
adăugat autor chris, sursa

2 răspunsuri

Eu folosesc într-adevăr într-adevăr rețelele atunci când lucrează cu sisteme încorporate sau când anumite API-uri o cer (adică să le ia ca argument pentru o funcție). De asemenea, dacă există doar unul sau două locuri în care aș fi nevoie să folosesc matrice sau nu am nevoie în mod specific de funcționalitatea vectorului, este mai logic să folosiți arrays doar din cauza supraîncărcării suplimentare a vectorului.

În caz contrar, utilizați numai vectori :)

0
adăugat
Aveți posibilitatea să transmiteți vectori atunci când se așteaptă o matrice: someFunc (& v [0]); .
adăugat autor chris, sursa
Celălalt punct este valabil, totuși. În funcție de modul și frecvența utilizării matricei, precum și de nevoile programului dvs., cheltuielile aferente unui vector pot fi excesive.
adăugat autor chris, sursa
@KonradRudolph, mă refer doar la întâmplarea rară atunci când apelarea de fiecare dată când utilizați o funcționalitate a vectorului (un alt apel de funcție) contează. Desigur, un program într-un milion de grijă, și eu s-ar putea să fiu în spatele timpului cu ceea ce compilatorii pot face.
adăugat autor chris, sursa
@KonradRudolph, Foarte bine să știți, mulțumesc. Asta face ca vectorii să fie mai buni.
adăugat autor chris, sursa
@crsn Nu conteaza ce ordine sunt membrii clasei. Presupunand existenta unui element, v [0] este necesar pentru a va da un pointer la primul element al unei secvente de elemente continue ( ca și același fel de pointer returnat de new int [5] ).
adăugat autor chris, sursa
@ chris, foarte adevărat.
adăugat autor kotakotakota, sursa
@chris Despre ce cheltuieli vorbești? Un vector stochează un număr întreg pentru capacitate, adică toate. În realitate, veți avea nevoie de acest lucru pentru majoritatea aplicațiilor oricum. În plus, este puțin neglijabilă includerea antetului, iar în majoritatea cazurilor este prezent oricum atunci când scrieți C ++ modern (cu excepția anumitor platforme încorporate).
adăugat autor Konrad Rudolph, sursa
@chris Ah, atunci vă greșiți. Un vector are funcția no pentru apelarea de funcții. De fapt, de performanță, este complet echivalent cu utilizarea unei matrice C. De fapt, eu sunt singurul programator dintr-un milion (am lucrat pe o bibliotecă de bioinformatică), așa că am măsurat acest lucru destul de atent.
adăugat autor Konrad Rudolph, sursa
@chris sunteți sigur că este garantat că someFunc (& v [0)) va funcționa? Vreau să spun că, gândindu-mă la implementare, va funcționa dacă implementarea vectorului stdc ++ de bază declară pointerul datelor ca prim membru al clasei. dacă din anumite motive șablonul declară pointerul la începutul datelor ca al doilea membru, acesta nu va funcționa.
adăugat autor crsnplusplus, sursa

Generally always prefer using std::vector since the destruction will be automatic once the vector goes out scope and the allocated memory will be placed neatly on the heap and all the memory will be handled for you. std::vector gives you everything you get in an array and even a guarantee that the elements will be contiguously stored in memory (except for std::vector).

In the case of std::vector you have to be careful since code like this will break:

 std::vector vb;
 vb.push_back(true);
 vb.push_back(false);
 vb.push_back(true);
 bool *pB = &vb[0];
 if( *(pB+1) )
 {
    //do something
 }

Fact is, std::vector doesn't store contiguous bools. This is an exception in the standard that is fixed in C++11.

0
adăugat
+1 pentru va fi plasat cu grijă pe heap (accentul meu), ceea ce înseamnă că scrierea accidentală în afara matricei nu va sfărâma teancul.
adăugat autor Matthieu M., sursa
@ K-ballo Right, editat post pentru a ține cont de acest lucru.
adăugat autor Chris A., sursa
Din fericire std :: vector este din nou un container adevărat în C ++ 11
adăugat autor K-ballo, sursa