Почему std::stack использует std:: deque по умолчанию?
поскольку для использования контейнера в стеке требуются только следующие операции:
- обратно()
- push_back ()
- pop_back ()
Почему-контейнер по умолчанию для него в начале очереди, а не вектор?
разве перераспределения deque не дают буфер элементов перед front (), так что push_front() является эффективной операцией? Не зря эти элементы, поскольку они никогда не будут использоваться в контексте стек?
Если нет накладных расходов для использования deque таким образом вместо вектора, почему по умолчанию для priority_queue вектор не deque также? (priority_queue требует front (), push_back () и pop_back () - по существу то же самое, что и для стека)
обновление на основе ответов ниже:
похоже, что способ реализации deque обычно представляет собой массив переменных размеров массивов фиксированного размера. Это делает рост быстрее, чем вектор (что требует перераспределения и копирования), поэтому для чего-то вроде стека, который связан с добавлением и удалением элементов, deque, вероятно, является лучшим выбором.
priority_queue требует значительной индексации, так как каждое удаление и вставка требует запуска pop_heap() или push_heap(). Это, вероятно, делает вектор лучшим выбором там, так как добавление элемента все еще амортизируется константой в любом случае.
2 ответов:
по мере роста контейнера перераспределение вектора требует копирования всех элементов в новый блок памяти. Растущий дек выделяет новый блок и связывает его со списком блоков - никакие копии не требуются.
конечно, вы можете указать, что при желании можно использовать другой контейнер поддержки. Поэтому, если у вас есть стек, который, как вы знаете, не будет сильно расти, скажите ему использовать вектор вместо дека, если это ваши предпочтения.
смотрите Херба Саттера гуру недели 54 для относительных достоинств вектора и дека, где оба будут делать.
Я полагаю, что несогласованность между priority_queue и queue заключается просто в том, что их реализовали разные люди.
Comments