Поскольку для использования контейнера в стеке требуются только следующие операции:
- назад ()
- отталкивать()
- pop_back ()
Почему контейнер по умолчанию для него - двухсторонняя очередь, а не вектор?
Разве перераспределение deque не дает буфер элементов перед front (), чтобы push_front () была эффективной операцией? Разве эти элементы не потрачены впустую, поскольку они никогда не будут использоваться в контексте стека?
Если нет накладных расходов на использование двухсторонней очереди таким образом вместо вектора, почему по умолчанию для priority_queue вектор, а не двухсторонняя очередь? (priority_queue требует front (), push_back () и pop_back () - по сути, то же, что и для стека)
Обновлено на основе ответов ниже:
Похоже, что способ, которым deque обычно реализуется, представляет собой массив переменного размера массивов фиксированного размера. Это делает рост быстрее, чем вектор (что требует перераспределения и копирования), поэтому для чего-то вроде стека, который предназначен для добавления и удаления элементов, deque, вероятно, будет лучшим выбором.
priority_queue сильно требует индексации, так как каждое удаление и вставка требует, чтобы вы запускали pop_heap () или push_heap (). Это, вероятно, делает вектор лучшим выбором, поскольку добавление элемента все равно амортизируется константой.
источник
Ответы:
По мере роста контейнера перераспределение вектора требует копирования всех элементов в новый блок памяти. При увеличении двухсторонней очереди выделяется новый блок и он связывается со списком блоков - копий не требуется.
Конечно, вы можете указать, что будет использоваться другой резервный контейнер, если хотите. Так что, если у вас есть стек, который, как вы знаете, не будет сильно расти, скажите ему использовать вектор вместо двухсторонней очереди, если вы так предпочитаете.
источник
std::deque
чем дляstd::vector
, и эти операции, вероятно, будут использоваться гораздо чаще, чем перераспределения. Мне трудно поверить, чтоstd::deque
это когда-либо победитstd::vector
на практике.list
, почемуdeque
?std::deque
что у вас есть шанс побитьstd::vector
на практике, или вы все еще сомневаетесь в этом? Спасибо.std::deque
будет работать так же хорошо, как иstd::vector
в практических приложениях. Но как бы то ни было, по моему личному опыту, мне нужны структуры данных стека и очереди не для одной большой и важной задачи, а для множества мелких случаев, пропитанных моим кодом. Поэтому меня больше волнует поведение в малом, чем в большом; и deque там светит особенно тускло. Я предпочитаю использовать ни один из них, а (самореализованные) односвязные списки. Но ваш пробег может отличаться.См. « Гуру недели 54» Херба Саттера, чтобы узнать об относительных достоинствах векторов и двухсторонней очереди, где подойдет любой из них.
Я полагаю, несогласованность между priority_queue и queue заключается просто в том, что их реализовали разные люди.
источник
priority_queue
должны оставаться отсортированными, поэтому более высокие накладные расходы на произвольный доступdeque::iterator
более проблематичны.priority_queue
есть "магический порядок", который поддерживается, он не сортируется. Однако ваша точка зрения остается неизменной.