std::vector
è una classe modello che incapsula un array dinamico 1 , memorizzato nell'heap, che cresce e si restringe automaticamente se gli elementi vengono aggiunti o rimossi. Esso fornisce tutti i ganci ( begin()
, end()
, iteratori, ecc), che lo rendono funzionano bene con il resto del STL. Ha anche diversi metodi utili che ti consentono di eseguire operazioni che su un array normale sarebbero ingombranti, come ad esempio l'inserimento di elementi nel mezzo di un vettore (gestisce tutto il lavoro di spostamento dei seguenti elementi dietro le quinte).
Poiché memorizza gli elementi in memoria allocati sull'heap, ha un certo sovraccarico rispetto agli array statici.
std::array
è una classe modello che incapsula un array di dimensioni statiche, memorizzato all'interno dell'oggetto stesso, il che significa che, se si crea un'istanza della classe nello stack, l'array stesso sarà nello stack. Le sue dimensioni devono essere conosciute al momento della compilazione (viene passata come parametro del modello) e non può crescere o ridursi.
È più limitato di std::vector
, ma spesso è più efficiente, soprattutto per le piccole dimensioni, perché in pratica è principalmente un involucro leggero attorno a un array in stile C. Tuttavia, è più sicuro, poiché la conversione implicita in puntatore è disabilitata e fornisce gran parte delle funzionalità relative a STL di std::vector
e degli altri contenitori, quindi puoi usarla facilmente con gli algoritmi STL & co. Comunque, proprio per la limitazione delle dimensioni fisse è molto meno flessibile di std::vector
.
Per un'introduzione a std::array
, dai un'occhiata a questo articolo ; per una rapida introduzione std::vector
e le operazioni che sono possibili su di essa, ti consigliamo di consultare la sua documentazione .
In realtà, penso che nello standard siano descritti in termini di massima complessità delle diverse operazioni (ad es. Accesso casuale in tempo costante, iterazione su tutti gli elementi in tempo lineare, aggiunta e rimozione di elementi alla fine in tempo ammortizzato costante, ecc.), ma AFAIK non esiste altro metodo per soddisfare tali requisiti se non quello di utilizzare un array dinamico. Come affermato da @Lucretiel, lo standard in realtà richiede che gli elementi siano archiviati in modo contiguo, quindi è un array dinamico, archiviato dove l'allocatore associato lo colloca.
std::vector
vs.std::array
e come i termini sono diversi.