Wektory mają dwa atrybuty „długości”, które oznaczają różne rzeczy:
size
to liczba użytecznych elementów w wektorze. Jest to liczba przechowywanych rzeczy. Jest to długość koncepcyjna.
capacity
to ile elementów zmieściłoby się w ilości pamięci, którą wektor aktualnie przydzielił.
capacity >= size
musi zawsze być prawdą, ale nie ma powodu, aby zawsze byli równi. Na przykład, po usunięciu elementu, zmniejszenie alokacji wymagałoby utworzenia nowego alokacji o jeden segment mniejszego i przeniesienia pozostałej zawartości („alokuj, przenieś, za darmo”).
Podobnie, jeśli capacity == size
dodasz element, wektor może zwiększyć alokację o jeden element (kolejna operacja „alokuj, przenieś, swobodnie”), ale zwykle dodajesz więcej niż jeden element. Jeśli pojemność musi wzrosnąć, wektor zwiększy swoją pojemność o więcej niż jeden element, dzięki czemu można dodać jeszcze kilka elementów przed ponownym przeniesieniem wszystkiego.
Dzięki tej wiedzy możemy odpowiedzieć na twoje pytanie:
std::vector<T>::resize()
zmienia rozmiar tablicy. Jeśli zmienisz rozmiar na mniejszy niż jego obecny rozmiar, nadmiar obiektów zostanie zniszczony. Jeśli zmienisz jego rozmiar na większy niż jego obecny rozmiar, „nowe” obiekty dodane na końcu zostaną domyślnie zainicjowane.
std::vector<T>::shrink_to_fit()
prosi o zmianę pojemności w celu dopasowania do bieżącego rozmiaru. (Implementacje mogą, ale nie muszą uwzględniać tego żądania. Mogą zmniejszyć pojemność, ale nie zrównają się z wielkością. Mogą w ogóle nic nie robić.) Jeśli żądanie zostanie spełnione, spowoduje to odrzucenie części lub całości niewykorzystanej części przydział wektora. Zwykle używasz tego, gdy skończysz budować wektor i nigdy nie dodasz do niego innego elementu. (Jeśli wiesz z góry, ile elementów dodasz, lepiej byłoby std::vector<T>::reserve()
powiedzieć wektorowi przed dodaniem jakichkolwiek elementów zamiast polegać na shrink_to_fit
robieniu czegokolwiek.)
Więc używasz, resize()
aby zmienić, ile rzeczy jest koncepcyjnie w wektorze.
Używasz tego, shrink_to_fit()
aby zminimalizować nadmiar miejsca, które wektor wewnętrznie przydzielił, bez zmiany ilości elementów koncepcyjnie w wektorze.