Los vectores tienen dos atributos de "longitud" que significan cosas diferentes:
size
es el número de elementos utilizables en el vector. Es la cantidad de cosas que has almacenado. Esta es una longitud conceptual.
capacity
es cuántos elementos cabrían en la cantidad de memoria que el vector ha asignado actualmente.
capacity >= size
debe ser siempre cierto, pero no hay razón para que sean siempre iguales. Por ejemplo, cuando elimina un elemento, reducir la asignación requeriría crear una nueva asignación un cubo más pequeño y mover el contenido restante ("asignar, mover, liberar").
De manera similar, si capacity == size
agrega un elemento, el vector podría aumentar la asignación en un elemento (otra operación "asignar, mover, liberar"), pero generalmente agregará más de un elemento. Si la capacidad necesita aumentar, el vector aumentará su capacidad en más de un elemento para que pueda agregar varios elementos más antes de tener que mover todo nuevamente.
Con este conocimiento, podemos responder a su pregunta:
std::vector<T>::resize()
cambia el tamaño de la matriz. Si cambia el tamaño más pequeño que su tamaño actual, los objetos en exceso se destruyen. Si cambia su tamaño por encima de su tamaño actual, los "nuevos" objetos agregados al final se inicializan por defecto.
std::vector<T>::shrink_to_fit()
pide que se cambie la capacidad para que coincida con el tamaño actual. (Las implementaciones pueden o no cumplir con esta solicitud. Pueden disminuir la capacidad pero no igualarla al tamaño. Es posible que no hagan nada en absoluto.) Si la solicitud se cumple, esto descartará parte o la totalidad de la porción no utilizada de La asignación del vector. Por lo general, usaría esto cuando haya terminado de construir un vector y nunca le agregará otro elemento. (Si sabe de antemano cuántos elementos agregará, sería mejor usar std::vector<T>::reserve()
para decir el vector antes de agregar cualquier elemento en lugar de confiar en shrink_to_fit
hacer algo).
Entonces usas resize()
para cambiar la cantidad de cosas conceptualmente en el vector.
Se usa shrink_to_fit()
para minimizar el exceso de espacio que el vector ha asignado internamente sin cambiar la cantidad de material que está conceptualmente en el vector.