Почему std :: stack использует std :: deque по умолчанию? - PullRequest
79 голосов
/ 19 сентября 2008

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

  • назад ()
  • push_back ()
  • pop_back ()

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

Не переделывают ли deque перераспределения буфер элементов перед front (), чтобы push_front () была эффективной операцией? Не потрачены ли эти элементы впустую, поскольку они никогда не будут использоваться в контексте стека?

Если для использования этого способа вместо вектора нет накладных расходов, то почему вектор по умолчанию для priority_queue также не является deque? (priority_queue требует front (), push_back () и pop_back () - по сути, то же самое, что и для стека)


Обновлено на основе ответов ниже:

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

priority_queue требует интенсивной индексации, поскольку при каждом удалении и вставке необходимо запускать pop_heap () или push_heap (). Это, вероятно, делает вектор лучшим выбором, поскольку добавление элемента все равно амортизируется константой.

Ответы [ 2 ]

71 голосов
/ 19 сентября 2008

По мере роста контейнера перераспределение вектора требует копирования всех элементов в новый блок памяти. Растущая ветвь выделяет новый блок и связывает его со списком блоков - копии не требуются.

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

12 голосов
/ 19 сентября 2008

См. Гуру Недели 54 от Херба Саттера об относительных достоинствах вектора и deque, где бы это ни было.

Я предполагаю, что несоответствие между priority_queue и очередью просто в том, что разные люди реализовали их.

...