Почему деки используются в качестве базового контейнера для стеков по умолчанию, когда векторы могли бы помочь?

Насколько я понимаю, любой контейнер, который поддерживает push_back(), pop_back() и back(), может использоваться в качестве базового контейнера для стеков, но по умолчанию используются деки. Я понимаю преимущества деков перед векторами в целом (возможность добавлять элементы как в начало, так и в конец), но в случае стеков я не вижу причин предпочитать деки.

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

463035818_is_not_a_number 16.03.2022 16:17

Таким образом, векторы имеют (в случае стеков) нерелевантное преимущество непрерывной памяти, в то время как деки имеют (в случае стеков) нерелевантное преимущество поддержки push_front(). И непрерывная память просто казалась БОЛЕЕ неактуальной (более дорогой?), чем поддержка push_front()? Я правильно тебя понимаю?

elvira.granqvist 16.03.2022 16:27

деки очень хорошо умеют толкать и выталкивать в конце. векторы не плохи в этом, но не настолько.

463035818_is_not_a_number 16.03.2022 16:29

Действительно? Почему деки лучше пушат и выталкивают в конце?

elvira.granqvist 16.03.2022 16:33

подробно в ответе

463035818_is_not_a_number 16.03.2022 16:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I don't see any reason to prefer deques.

Причина предпочтения deque, применимого к варианту использования стека, заключается в том, что отдельная обратная передача имеет постоянную сложность в наихудшем случае по сравнению с вектором, индивидуальная обратная передача которого в наихудшем случае является линейной (он амортизирует постоянную сложность в течение нескольких обратных перемещений). Это было особенно важно до C++11, когда при перераспределении вектора приходилось копировать элементы, что могло быть очень дорого. Рассмотрим случай, когда сами элементы представляют собой длинные строки.

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

Исторически сложилось так, что при разработке STL и, следовательно, при выборе значения по умолчанию также возникали проблемы с очень большими векторами, поскольку размер адресного пространства не превышал (значительно или совсем) объем памяти (это было до 64-битная обработка была обычным явлением). Следствием ограниченного адресного пространства было то, что фрагментация памяти делала дорогостоящим или невозможным выделение больших смежных блоков памяти, которые потребовались бы для большого вектора. Более того, то, как этот вектор растет за счет освобождения старых буферов, является поведением, вызывающим такую ​​фрагментацию.

Другие вопросы по теме