Matrici e vettori: somiglianze e differenze introduttive [chiuso]


111

Quali sono le differenze tra un array e un vettore in C ++? Un esempio delle differenze potrebbe essere incluso biblioteche, simbolismo, abilità, ecc.

Vettore

Gli array contengono un numero specifico di elementi di un tipo particolare. Affinché il compilatore possa riservare la quantità di spazio richiesta quando il programma viene compilato, è necessario specificare il tipo e il numero di elementi che l'array conterrà quando viene definito. Il compilatore deve essere in grado di determinare questo valore quando il programma viene compilato. Una volta definito un array, si utilizza l'identificatore dell'array insieme a un indice per accedere a elementi specifici dell'array. gli array [...] sono indicizzati a zero; cioè, il primo elemento è all'indice 0. Questo schema di indicizzazione è indicativo della stretta relazione in C ++ tra puntatori e array e le regole che il linguaggio definisce per l'aritmetica dei puntatori.

- Riferimento tascabile C ++

Vettore

Un vettore è una sequenza di oggetti di dimensioni dinamiche che fornisce operator[]un accesso casuale in stile array . La funzione membro push_backcopia i suoi argomenti tramite il costruttore di copia, aggiunge quella copia come ultimo elemento nel vettore e ne incrementa la dimensione di uno.pop_backfa l'esatto contrario, rimuovendo l'ultimo elemento. L'inserimento o l'eliminazione di elementi dalla fine di un vettore richiede un tempo costante ammortizzato e l'inserimento o l'eliminazione da qualsiasi altra posizione richiede tempo lineare. Queste sono le basi dei vettori. C'è molto di più in loro. Nella maggior parte dei casi, un vettore dovrebbe essere la tua prima scelta su un array in stile C. Prima di tutto, sono dimensionati dinamicamente, il che significa che possono crescere secondo necessità. Non devi fare tutti i tipi di ricerca per capire una dimensione statica ottimale, come nel caso degli array C; un vettore cresce in base alle esigenze e può essere ridimensionato manualmente più grande o più piccolo se necessario. In secondo luogo, i vettori offrono il controllo dei limiti con la atfunzione membro (ma non conoperator[]), in modo che tu possa fare qualcosa se fai riferimento a un indice inesistente invece di guardare semplicemente il tuo programma andare in crash o, peggio, continuare l'esecuzione con dati corrotti.

- Ricettario C ++


Differenza fondamentale: ci sono scopi per i quali il vettore è una buona scelta.
Jerry Coffin

1
"esaustivo" e "consise" sono ortogonali. Cioè, non solo l'uno non implica l'altro, ma non sono nemmeno sulla stessa scala.
Gare di leggerezza in orbita

2
Mi arrabbio molto quando le persone chiudono domande che sono esattamente le informazioni che sto cercando. Questo accade troppo spesso.
Robert Tamlyn,

Risposte:


142

array:

  • sono un costrutto del linguaggio incorporato;
  • provengono quasi invariati da C89;
  • fornire solo una sequenza di elementi contigua e indicizzabile ; niente campane e fischietti;
  • sono di dimensione fissa; non è possibile ridimensionare un array in C ++ (a meno che non sia un array di POD ed è allocato con malloc);
  • la loro dimensione deve essere una costante in fase di compilazione a meno che non siano allocate dinamicamente;
  • prendono il loro spazio di archiviazione a seconda dell'ambito in cui li dichiari;
  • se allocati dinamicamente, è necessario rilasciarli esplicitamente;
  • se sono allocati dinamicamente, ottieni solo un puntatore e non puoi determinare la loro dimensione; altrimenti, puoi usare sizeof(da qui il linguaggio comune sizeof(arr)/sizeof(*arr), che però fallisce silenziosamente se usato inavvertitamente su un puntatore);
  • decade automaticamente in un puntatore nella maggior parte delle situazioni; in particolare, ciò accade quando si passano a una funzione, che normalmente richiede il passaggio di un parametro separato per la loro dimensione;
  • non può essere restituito da una funzione;
  • non può essere copiato / assegnato direttamente;
  • array dinamici di oggetti richiedono un costruttore predefinito, poiché tutti i loro elementi devono essere costruiti per primi;

std::vector:

  • è una classe modello;
  • è solo un costrutto C ++;
  • è implementato come array dinamico ;
  • cresce e si restringe dinamicamente;
  • gestire automaticamente la loro memoria, che si libera con la distruzione;
  • può essere passato a / restituito da funzioni (per valore);
  • può essere copiato / assegnato (esegue una copia completa di tutti gli elementi memorizzati);
  • non decade in puntatori, ma è possibile ottenere esplicitamente un puntatore ai loro dati ( &vec[0]è garantito che funzioni come previsto);
  • porta sempre con l'array dinamico interno la sua dimensione (quanti elementi sono attualmente memorizzati) e la capacità (quanti elementi possono essere memorizzati nel blocco attualmente allocato);
  • l'array dinamico interno non viene allocato all'interno dell'oggetto stesso (che contiene solo pochi campi di "contabilità"), ma viene allocato dinamicamente dall'allocatore specificato nel relativo parametro del template; quello predefinito ottiene la memoria dal freestore (il cosiddetto heap), indipendentemente da come è allocato l'oggetto reale;
  • per questo motivo, possono essere meno efficienti degli array "normali" per array locali piccoli e di breve durata;
  • durante la riallocazione, gli oggetti vengono copiati (spostati, in C ++ 11);
  • non richiede un costruttore predefinito per gli oggetti archiviati;
  • è meglio integrato con il resto del cosiddetto STL (fornisce i metodi begin()/ end(), i soliti STL typedef, ...)

Considera anche la "moderna alternativa" agli array - std::array; Ho già descritto in un'altra risposta la differenza tra std::vectore std::array, potresti dare un'occhiata.


1
Grazie, @MatteoItalia. Un riferimento o due sarebbero carini.
Trancot

1
@Trancot: qualsiasi buon libro in C ++ andrà bene.
Matteo Italia

6
@Trancot: Non posso davvero darti riferimenti migliori - le differenze evidenziate in questo post provengono da molte parti diverse dello Standard e sono meglio comprese con l'aiuto di un buon manuale C ++.
Matteo Italia

Un esempio di una descrizione così ampia sarebbe fantastico!
carloswm85

26

Aggiungerò che gli array sono costrutti di livello molto basso in C ++ e dovresti cercare di starne lontano il più possibile quando "impari le basi" - anche Bjarne Stroustrup lo consiglia (è il progettista di C ++).

I vettori si avvicinano molto alle stesse prestazioni degli array, ma con molte comodità e caratteristiche di sicurezza. Probabilmente inizierai a utilizzare gli array quando ti interfacci con API che si occupano di array non elaborati o quando crei le tue raccolte.


1
Interfaccia del programma applicativo: ( en.wikipedia.org/wiki/API ). È una raccolta di punti di ingresso a un'entità software (pacchetto, libreria, sistema operativo). Alcune API avranno punti di ingresso come strcat (char * dst, char * src), dove dst e src sono trattati come matrici di caratteri (anche se la firma della funzione implica puntatori a caratteri).
John Källén

11

Quelle referenze hanno praticamente risposto alla tua domanda. In poche parole, le lunghezze dei vettori sono dinamiche mentre gli array hanno una dimensione fissa. quando si utilizza un array, si specifica la sua dimensione al momento della dichiarazione:

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

per i vettori, è sufficiente dichiararlo e aggiungere elementi

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

a volte non si conosce il numero di elementi necessari, quindi un vettore sarebbe l'ideale per una situazione del genere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.