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

Deque - почему "резерв" не существует?

Стандартный векторный контейнер STL имеет "резервную" функцию для резервирования неинициализированной памяти, которая может использоваться позже для предотвращения перераспределения.

Как получилось, что у другого контейнера deque нет?

4b9b3361

Ответ 1

Увеличение размера std::vector может быть дорогостоящим. Когда vector переходит зарезервированное пространство, все содержимое вектора должно быть скопировано (или перемещено) в больший резерв.

Именно потому, что std::vector resizing может быть дорогостоящим, существует vector::reserve().

И наоборот, deque всегда может добавить больше памяти без необходимости перемещать существующие элементы.

Ответ 2

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

В deque и list более ранние ссылки никогда не аннулируются вставками в конце, а элементы не перемещаются, поэтому необходимость в резервировании емкости не возникает.

Можно подумать, что с vector и string резервирование пространства также гарантирует, что более поздние вставки не сгенерируют исключение (если не сгенерирует конструктор), поскольку нет необходимости выделять память. Вы можете подумать, что такая же гарантия будет полезна для других последовательностей, и, следовательно, deque::reserve будет иметь возможное применение. На самом деле нет такой гарантии для vector и string, хотя в большинстве (всех?) Реализаций это правда. Так что это не является целью reserve.

Ответ 3

Цитата из Справочник по С++

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

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

Ответ 4

Только vector есть. Нет необходимости в резервной функции для deque, поскольку элементы не сохраняются постоянно и нет необходимости перераспределять и перемещать элементы при добавлении или удалении элементов.

Ответ 5

резерв подразумевает выделение больших блоков смежных данных (например, вектор). В dequeue нет ничего, что подразумевает непрерывное хранение - оно обычно больше похоже на список (который вы заметите, также не имеет функции "резерв" ).

Таким образом, функция "резерв" не имеет смысла.

Ответ 6

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