Векторы имеют два атрибута "length", которые означают разные вещи:
size
- количество используемых элементов в векторе. Это количество вещей, которые вы сохранили. Это концептуальная длина. capacity
- это количество элементов, которое поместится в объем памяти, выделенный вектором.
capacity >= size
всегда должно быть истинным, но у них нет причин быть всегда равными. Например, при удалении элемента для сокращения выделения потребуется создать новое выделение на один контейнер меньше и переместить оставшееся содержимое поверх («allocate, move, free»).
Аналогично, если capacity == size
и Если вы добавляете элемент, вектор может увеличивать выделение на один элемент (другая операция «выделить, переместить, освободить»), но обычно вы собираетесь добавить более одного элемента. Если емкость нужно увеличить, вектор увеличит свою емкость на больше, чем один элемент, так что вы можете добавить еще несколько элементов, прежде чем вам понадобится переместить все снова.
С этим знанием мы можете ответить на ваш вопрос:
std::vector<T>::resize()
изменяет размер массива. Если вы измените его размер меньше текущего размера, лишние объекты будут уничтожены. Если вы измените его размер больше его текущего размера, «новые» объекты, добавленные в конце, инициализируются по умолчанию. std::vector<T>::shrink_to_fit()
запрашивает изменение Capacity в соответствии с текущим размер. (Реализации могут или не выполнять этот запрос. Они могут уменьшить емкость, но не сделать ее равной размеру. Они могут вообще ничего не делать.) Если запрос выполнен, некоторые из них будут отброшены или все неиспользованную часть выделения вектора. Вы обычно используете это, когда вы закончите создание вектора и никогда не добавите к нему другой элемент. (Если вы заранее знаете, сколько элементов вы будете добавлять, было бы лучше использовать std::vector<T>::reserve()
, чтобы сообщить вектору, прежде чем добавлять какие-либо элементы, вместо того, чтобы shrink_to_fit
что-либо делать.)
Таким образом, вы используете resize()
, чтобы изменить того, сколько вещей концептуально в векторе.
Вы используете shrink_to_fit()
, чтобы минимизировать избыточное пространство, которое вектор выделил внутри без концептуально изменяя количество материала в векторе.