std::vector
é uma classe de modelo que encapsula uma matriz dinâmica 1 , armazenada na pilha, que cresce e diminui automaticamente se elementos forem adicionados ou removidos. Ele fornece todos os ganchos ( begin()
, end()
iteradores, etc.) que o fazem funcionar bem com o restante do STL. Ele também possui vários métodos úteis que permitem executar operações que em uma matriz normal seriam complicadas, como, por exemplo, inserir elementos no meio de um vetor (ele lida com todo o trabalho de mover os seguintes elementos nos bastidores).
Como ele armazena os elementos na memória alocada no heap, há alguma sobrecarga em relação às matrizes estáticas.
std::array
é uma classe de modelo que encapsula uma matriz de tamanho estatístico, armazenada dentro do próprio objeto, o que significa que, se você instanciar a classe na pilha, a própria matriz estará na pilha. Seu tamanho deve ser conhecido no momento da compilação (é passado como parâmetro do modelo) e não pode aumentar ou diminuir.
É mais limitado do que std::vector
, mas geralmente é mais eficiente, especialmente para tamanhos pequenos, porque na prática é principalmente um invólucro leve em torno de uma matriz no estilo C. No entanto, é mais seguro, pois a conversão implícita em ponteiro está desabilitada e fornece grande parte da funcionalidade relacionada a STL de std::vector
e dos outros contêineres, para que você possa usá-lo facilmente com os algoritmos STL & co. De qualquer forma, para a própria limitação do tamanho fixo, é muito menos flexível que std::vector
.
Para uma introdução std::array
, dê uma olhada neste artigo ; Para uma rápida introdução std::vector
e as operações possíveis, consulte a documentação .
Na verdade, acho que no padrão eles são descritos em termos de complexidade máxima das diferentes operações (por exemplo, acesso aleatório em tempo constante, iteração sobre todos os elementos em tempo linear, adição e remoção de elementos no final em tempo amortizado constante, etc), mas no AFAIK não há outro método para atender a esses requisitos além de usar uma matriz dinâmica. Conforme declarado por @Lucretiel, o padrão realmente exige que os elementos sejam armazenados de forma contígua, portanto , é uma matriz dinâmica, armazenada onde o alocador associado o coloca.
std::vector
vs.std::array
e como os termos são diferentes.