Подтвердить что ты не робот

Изменяет ли std::vector:: resize() когда новый размер меньше текущего размера?

Возможный дубликат:
std::vector изменить размер вниз

Если я resize() a std::vector до некоторого размера, меньшего, чем его текущий размер, возможно ли, что вектор будет выделять новую память?

Это важно для меня по соображениям производительности.

4b9b3361

Ответ 1

Нет, resize переход к меньшему размеру никогда не перераспределяется.

Если контейнер сжимается, все итераторы, указатели и ссылки на элементы, которые не были удалены, остаются действительными после изменения размера и ссылаются на те же элементы, к которым они ссылались до вызова.

(Из здесь)

Учитывая это, мы можем быть уверены, что перераспределение не могло произойти.

Ответ 2

resize() при уменьшении только изменений логического размера. Другие уже ответили на это, поэтому я ничего здесь не добавляю. Целью этого является оптимизация скорости, поскольку ему не нужно перераспределять или перемещать любые данные.

Однако, когда вы хотите оптимизировать использование памяти, С++ 11 представила еще одну функцию shrink_to_fit(), которую вы можете вызвать после своего resize() (или даже в любое другое время), который фактически гарантирует, что вы не платите за любую память, которую вы не хотите.

Ответ 3

Нет. vector никогда, никогда не уменьшит его память, за исключением нескольких довольно специфических условий. Помните, что когда размер vector изменяется, итераторы недействительны, поэтому он не может обойти это за вашей спиной - это наблюдаемое изменение, а стандарт указывает точно, когда это может произойти или не произойдет.

Ответ 4

Нет.

Вектор использует два значения: размер и емкость. Размер представляет собой фактическое количество элементов, хранящихся в векторе, тогда как емкость возвращается к выделенному зарезервированному пространству в памяти. Увеличение производительности происходит за счет выделения большего пространства, чем это необходимо.

Только когда выполняется запрос на изменение размера, который приведет к увеличению емкости, превышающей текущую, произойдет перераспределение. Кроме того, если вы попытаетесь вставить много элементов в середине вектора, это повлияет на производительность алгоритма, поскольку все элементы после того, как вставленные должны быть перемещены (иногда это может вызвать перераспределение, если вы превысите емкость вектор).

Вы можете использовать функцию резервирования для дальнейшего увеличения скорости: функция-член резерва будет следить за тем, чтобы емкость была установлена ​​на определенное значение.

Вы можете узнать больше о std::vector на стр. 148 - в книге Стандартная библиотека С++: учебное пособие и справочная информация.

Ответ 5

Сначала вам нужно измерить то, что вы хотите оптимизировать, производительность одна недостаточно, что вы имеете в виду? Реактивность UI? которые требуют типичного действия пользователя, для которого вы измеряете время. Тяжелый алгоритм? и так далее... Тогда вам нужно найти, где узкое место, может быть память, доступ к диску и т.д., А в конце может быть vector:: resize, но только в конце! И то, как вы задаете свой вопрос, я ставлю свой $, что вектор:: resize не будет узким местом.

Будьте уверены, что STL разработан, проверьте свой код перед изменением поведения STL; -)