Вектори мають два атрибути "довжини", які означають різні речі:
size
- кількість корисних елементів у векторі. Це кількість речей, які ви зберегли. Це концептуальна довжина.
capacity
- скільки елементів би вмістилося в об'єм пам'яті, який вектор виділив.
capacity >= size
завжди повинні бути правдивими, але немає причини, щоб вони завжди були рівними. Наприклад, коли ви видаляєте елемент, зменшення розподілу вимагатиме створення нового виділення на одне відро менше і переміщення решти вмісту ("виділити, перемістити, звільнити").
Аналогічно, якщо capacity == size
і ви додасте елемент, вектор може збільшити розподіл на один елемент (інший операція "виділити, перемістити, вільно"), але зазвичай ви збираєтеся додати більше одного елемента. Якщо ємність потрібно збільшити, вектор збільшить свою ємність більш ніж на один елемент, так що ви можете додати ще кілька елементів, перш ніж потрібно перенести все заново.
Маючи ці знання, ми можемо відповісти на ваше запитання:
std::vector<T>::resize()
змінює розмір масиву. Якщо змінити його розмір менше, ніж його поточний розмір, надлишки об'єктів знищуються. Якщо ви зміните його розмір більше, ніж його поточний розмір, "нові" об'єкти, додані в кінці, ініціалізуються за замовчуванням.
std::vector<T>::shrink_to_fit()
просить змінити ємність відповідно до поточного розміру. (Виконавці можуть або не задовольнити цей запит. Вони можуть зменшити ємність, але не зрівняти його з розміром. Вони можуть взагалі нічого не зробити.) Якщо запит буде виконано, це відкине частину або всю невикористану частину виділення вектора. Зазвичай ви користуєтеся цим, коли закінчите створювати вектор, і ніколи не додасте до нього ще один елемент. (Якщо ви заздалегідь знаєте, скільки предметів ви будете додавати, то краще було std::vector<T>::reserve()
б розповісти вектору, перш ніж додавати будь-які елементи, а не покладатися на shrink_to_fit
те, щоб робити що-небудь.)
Таким чином, ви використовуєте resize()
для зміни кількості концептуальних елементів у векторі.
Ви використовуєте shrink_to_fit()
для мінімізації надлишкового простору, який вектор виділив всередині, не змінюючи, скільки матеріалу є концептуально у векторі.