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

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

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

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

14

Решение

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

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

(От Вот)

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

10

Другие решения

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

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

5

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

1

Нет.

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

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

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

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

1

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

Будьте уверены в том, как спроектирован STL, проверьте код перед изменением поведения STL 😉

1
По вопросам рекламы [email protected]