Sobes.tech
Middle

O que acontece com o vetor (std::vector) ao adicionar um elemento?

sobes.tech IA

Resposta da IA

Ao adicionar um elemento ao std::vector (por exemplo, usando push_back), os seguintes passos ocorrem:

  1. Verificação de capacidade: O vetor verifica se a memória alocada atualmente (capacidade) é suficiente para acomodar um novo elemento.
  2. Expansão, se necessário:
    • Se size() < capacity(), o novo elemento é simplesmente colocado no próximo espaço livre, e size() aumenta em 1.
    • Se size() == capacity(), o vetor deve aumentar sua capacidade. Isso geralmente é feito alocando um novo bloco de memória maior. O tamanho do novo bloco costuma ser várias vezes maior que o atual (por exemplo, duplicando).
  3. Cópia/Movimento de elementos (ao expandir): Todos os elementos existentes do antigo bloco de memória são copiados (ou movidos, se o tipo de elemento suportar movimento e houver um construtor/operador adequado) para o novo bloco.
  4. Posicionamento do novo elemento: O novo elemento é adicionado ao final do novo bloco de memória.
  5. Liberação da memória antiga: O bloco de memória antigo é liberado.
  6. Atualização de ponteiros/tamanhos: Os ponteiros internos (apontando para o início e o fim dos dados, bem como para o fim da memória alocada) são atualizados, e o valor de size() também é incrementado.

Essa operação pode ser custosa devido a possíveis realocações de memória, cópias/movimentos de elementos e liberações de memória antiga. Ela também pode invalidar iteradores e referências que apontam para os elementos do vetor antes da adição.