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

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

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

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


person Alex Flint    schedule 14.01.2013    source источник
comment
посмотрите здесь   -  person Ivaylo Strandjev    schedule 14.01.2013


Ответы (5)


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

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

(Из здесь)

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

person Chowlett    schedule 14.01.2013
comment
Чтобы было ясно, это не формальная гарантия того, что он не будет перераспределен. Но трудно представить, как это могло быть, поскольку для этого нужно было бы найти способ поддерживать итераторы в рабочем состоянии, а все мыслимые способы сделать это ужасны. (И, по-видимому, реализация будет делать это только в том случае, если она улучшит ситуацию, и в этом случае вы должны быть счастливы, что она может сделать вещи даже лучше, чем отсутствие перераспределения.) - person David Schwartz; 14.01.2013
comment
Я считаю, что в случае vector Стандарт довольно конкретно описывает перераспределение. - person Puppy; 14.01.2013
comment
@DeadMG: Возможно, вы правы насчет vector, поскольку его итераторы уже очень ограничены. - person David Schwartz; 14.01.2013
comment
@DavidSchwartz - честная точка. Меня всегда улавливают точные законы C ++. Я скорее подозреваю, что DeadMG прав, и это обнадеживает. - person Chowlett; 14.01.2013
comment
@DavidSchwartz: для итераторов это довольно просто, однако для указателей и ссылок элементы просто не могут перемещаться в памяти. - person Matthieu M.; 14.01.2013
comment
@MatthieuM .: Этого достаточно, чтобы убедить меня, что вектор не может перераспределяться при сжатии. Однако этот аргумент не применим к другим контейнерам, поскольку они могут перераспределяться без аннулирования указателей и ссылок. - person David Schwartz; 14.01.2013
comment
Остальные контейнеры значения не имеют. В вопросе четко указано vector- это начало и конец. Перераспределение не имеет смысла даже в контексте любого другого контейнера. - person Puppy; 14.01.2013

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

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

person CashCow    schedule 14.01.2013
comment
+1 за упоминание shrink_to_fit. Но строго видно, это только рекомендация. Реализация не обязана сжимать вектор даже для этой функции (хотя было бы действительно странно, если бы это было не так). - person Christian Rau; 14.01.2013

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

person Puppy    schedule 14.01.2013
comment
Не могли бы вы подробнее остановиться на конкретных условиях, о которых вы упомянули? - person Alex Flint; 15.01.2013

No.

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

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

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

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

person tmaric    schedule 14.01.2013

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

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

person Jean Davy    schedule 14.01.2013
comment
По-видимому, меньшее использование памяти. Это также один из показателей производительности. - person CashCow; 14.01.2013
comment
@CashCow Я не согласен, вы можете легко представить себе сценарии, в которых объем памяти минимален, а отзывчивость пользователя плохая, очень часто, не всегда, производительность является многофакторной, поскольку вы увеличиваете то, что вы уменьшаете, другое, так как вы не определяете точно, с мерой, что такое производительность, над которой вы не можете работать. Вы можете потратить много дней на оптимизацию для сценария, а затем обнаружите позже, предпочтительно через критически важный для клиента проект, что ваша оптимизация vector :: resize имеет очень плохой побочный эффект для другого сценария ... - person Jean Davy; 16.01.2013