Os vetores têm dois atributos "comprimento" que significam coisas diferentes:
size
é o número de elementos utilizáveis no vetor. É o número de coisas que você armazenou. Este é um comprimento conceitual.
capacity
é quantos elementos caberiam na quantidade de memória que o vetor alocou atualmente.
capacity >= size
deve sempre ser verdade, mas não há razão para que sejam sempre iguais. Por exemplo, quando você remove um elemento, reduzir a alocação exigiria a criação de uma nova alocação um depósito menor e a movimentação do conteúdo restante ("alocar, mover, livre").
Da mesma forma, se capacity == size
você adicionar um elemento, o vetor poderá aumentar a alocação em um elemento (outra operação "alocar, mover, liberar"), mas geralmente você adicionará mais de um elemento. Se a capacidade precisar aumentar, o vetor aumentará sua capacidade em mais de um elemento, para que você possa adicionar vários outros elementos antes de precisar mover tudo novamente.
Com esse conhecimento, podemos responder à sua pergunta:
std::vector<T>::resize()
altera o tamanho da matriz. Se você o redimensionar menor que o tamanho atual, os objetos em excesso serão destruídos. Se você redimensioná-lo maior que seu tamanho atual, os "novos" objetos adicionados no final serão inicializados por padrão.
std::vector<T>::shrink_to_fit()
solicita que a capacidade seja alterada para corresponder ao tamanho atual. (As implementações podem ou não atender a essa solicitação. Elas podem diminuir a capacidade, mas não torná-la igual ao tamanho. Elas podem não fazer nada.) Se a solicitação for atendida, isso descartará parte ou toda a parte não utilizada do alocação do vetor. Você usaria isso normalmente quando terminar de construir um vetor e nunca adicionará outro item a ele. (Se você souber com antecedência quantos itens você estará adicionando, seria melhor usar std::vector<T>::reserve()
para informar o vetor antes de adicionar qualquer item, em vez de confiar em shrink_to_fit
fazer qualquer coisa.)
Então você usa resize()
para alterar a quantidade de coisas conceitualmente no vetor.
Você usa shrink_to_fit()
para minimizar o excesso de espaço que o vetor alocou internamente, sem alterar a quantidade conceitual de coisas no vetor.