Arrays vs Vectors: Semelhanças e Diferenças Introdutórias

Quais são as diferenças entre uma matriz e um vetor em C ++? Um exemplo das diferenças pode include bibliotecas, simbolismo, habilidades, etc.

Matriz

Matrizes contêm um número específico de elementos de um determinado tipo. Para que o compilador possa reservar a quantidade necessária de espaço quando o programa é compilado, você deve especificar o tipo e o número de elementos que o array conterá quando for definido. O compilador deve ser capaz de determinar esse valor quando o programa é compilado. Depois que uma matriz tiver sido definida, você usará o identificador da matriz junto com um índice para acessar elementos específicos da matriz. […] matrizes são indexadas com zero; ou seja, o primeiro elemento está no índice 0. Esse esquema de indexação é indicativo do relacionamento próximo em C ++ entre pointers e matrizes e as regras que a linguagem define para aritmética de pointers.

– referência do bolso de C ++

Vetor

Um vetor é uma seqüência de objects dinamicamente dimensionada que fornece access random ao operator[] array operator[] . A function de membro push_back copia seus argumentos via construtor de cópia, adiciona essa cópia como o último item no vetor e incrementa seu tamanho em um. pop_back faz exatamente o oposto, removendo o último elemento. A inserção ou exclusão de itens do final de um vetor consome tempo constante amortizado e a inserção ou exclusão de qualquer outro local leva um tempo linear. Estes são os fundamentos dos vetores. Há muito mais para eles. Na maioria dos casos, um vetor deve ser sua primeira escolha em um array no estilo C. Primeiro de tudo, eles são dimensionados dinamicamente, o que significa que eles podem crescer conforme necessário. Você não precisa fazer todo tipo de pesquisa para descobrir um tamanho estático ideal, como no caso de arrays C; um vetor cresce conforme o necessário e pode ser redimensionado maior ou menor manualmente, se necessário. Segundo, os vetores oferecem verificação de limites com a function de membro (mas não com operator[] ), para que você possa fazer algo se referenciar um índice inexistente em vez de simplesmente assistir a uma falha do programa ou pior, continuando a execução com dados corrompidos.

– Livro de Receitas C ++

matrizes:

  • são uma construção de linguagem integrada;
  • vem quase inalterado de C89;
  • fornecer apenas uma sequência contígua e indexável de elementos ; sem sinos e assobios;
  • são de tamanho fixo; você não pode resize uma matriz em C ++ (a menos que seja uma matriz de POD e esteja alocada com malloc );
  • seu tamanho deve ser uma constante de tempo de compilation, a menos que eles sejam alocados dinamicamente;
  • eles ocupam seu espaço de armazenamento dependendo do escopo onde você os declara;
  • se alocado dinamicamente, você deve desalocá-los explicitamente;
  • se eles forem alocados dinamicamente, você terá um ponteiro e não poderá determinar seu tamanho; caso contrário, você pode usar sizeof (daí o common idiom sizeof(arr)/sizeof(*arr) , que, no entanto, falha silenciosamente quando usado inadvertidamente em um ponteiro);
  • decair automaticamente para os pointers na maioria das situações; em particular, isso acontece quando eles são passados ​​para uma function, o que geralmente requer a passagem de um parâmetro separado para seu tamanho;
  • não pode ser retornado de uma function;
  • não pode ser copiado / atribuído diretamente;
  • matrizes dinâmicas de objects requerem um construtor padrão, uma vez que todos os seus elementos devem ser construídos primeiro;

std::vector :

  • é uma class de modelo;
  • é uma construção somente em C ++;
  • é implementado como um array dynamic ;
  • cresce e encolhe de forma dinâmica;
  • gerenciar automaticamente sua memory, que é liberada na destruição;
  • pode ser passado para / retornado de funções (por valor);
  • pode ser copiado / atribuído (isto executa uma cópia profunda de todos os elementos armazenados);
  • não se decompõe em pointers, mas você pode obter explicitamente um ponteiro para seus dados ( &vec[0] funciona garantidamente);
  • sempre traz junto com o array dynamic interno seu tamanho (quantos elementos estão atualmente armazenados) e capacidade (quantos elementos podem ser armazenados no bloco atualmente alocado);
  • a matriz dinâmica interna não é alocada dentro do próprio object (que contém apenas alguns campos de “escrituração contábil”), mas é alocada dinamicamente pelo alocador especificado no parâmetro de modelo relevante; o padrão obtém a memory do freestore (o chamado heap), independentemente de como o object real é alocado;
  • por esse motivo, eles podem ser menos eficientes do que os arrays “regulares” para arrays locais pequenos e de vida curta;
  • ao realocar, os objects são copiados (movidos, em C ++ 11);
  • não requer um construtor padrão para os objects que estão sendo armazenados;
  • é melhor integrado com o resto do chamado STL (ele fornece os methods begin() / end() , os typedef STL usuais, …)

Considere também a “alternativa moderna” para arrays – std::array ; Eu já descrevi em outra resposta a diferença entre std::vector e std::array , você pode querer dar uma olhada nele.

Eu adicionarei que arrays são construções de nível muito baixo em C ++ e você deve tentar ficar longe deles o máximo possível quando “aprender as cordas” – até mesmo Bjarne Stroustrup recomenda isto (ele é o projetista de C ++).

Vetores vêm muito perto do mesmo desempenho que matrizes, mas com muitas conveniências e resources de segurança. Você provavelmente começará a usar arrays ao fazer interface com APIs que lidam com matrizes brutas ou ao criar suas próprias collections.

Essas referências praticamente responderam à sua pergunta. Simplificando, os comprimentos dos vetores são dynamics, enquanto os arrays têm um tamanho fixo. Ao usar uma matriz, você especifica seu tamanho na declaração:

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

para vetores, você apenas declara e adiciona elementos

 vector myVector; myVector.push_back(1); myVector.push_back(2); myVector.push_back(3); ... 

às vezes você não sabe o número de elementos necessários para que um vetor seja ideal para tal situação.