Me deparei com estas declarações:
resize(n)
- Redimensiona o contêiner para que ele contenha elementos 'n'.
shrink_to_fit()
- Reduz a capacidade do contêiner para caber em seu tamanho e destrói todos os elementos além da capacidade.
Existe alguma diferença significativa entre essas funções? eles vêm sob vetores em c ++
shrink_to_fit
altera a capacidade.capacity
esize
?Respostas:
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 usarstd::vector<T>::reserve()
para informar o vetor antes de adicionar qualquer item, em vez de confiar emshrink_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.fonte
shrink_to_fit
não é tudo ou nada. Uma implementação pode reduzir a capacidade parcialmente. Por exemplo, considere uma implementação que restrinja a capacidade de vetores a potências de dois.Isso é uma descaracterização do que acontece. Em particular, a destruição de todos os elementos além da parte da capacidade não é precisa.
No C ++, quando a memória é usada dinamicamente para objetos, há duas etapas:
Quando objetos na memória alocada dinamicamente são excluídos, também existem duas etapas, que refletem as etapas de construção, mas em ordem inversa:
A memória alocada além do tamanho do contêiner é apenas buffer. Eles não contêm nenhum objeto inicializado corretamente. É apenas memória bruta.
shrink_to_fit()
garante que a memória adicional não esteja lá, mas não haja objetos nesses locais. Portanto, nada é destruído, apenas a memória é desalocada.fonte
De acordo com o padrão C ++ relativo a
shrink_to_fit
e em relação a
resize
É evidente que as funções fazem coisas diferentes. Além disso, a primeira função não possui parâmetro, enquanto a segunda função possui até dois parâmetros. A função
shrink_to_fit
não altera o tamanho do contêiner, mas pode realocar a memória.fonte