2016-06-03 4 views
1

Зачем использовать std::stack или std::queue, а не std::vector или std::deque?Зачем использовать std :: stack или std :: queue?

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

+0

Потому что есть алгоритмы, которые работают с использованием стеков и очередей. Почему бы не использовать их при попытке использовать список/вектор и рефакторинг всех ваших алгоритмов? Если я серьезно не пропущу что-то здесь. –

+0

Просто, чтобы предотвратить * повторное изобретательство колеса *. Верно, что мы можем добиться всего, но почему что-то с нуля, если имеется другой вариант? Кроме того, начиная с нуля может сделать наш индивидуально разработанный код ошибкой и ошибкой. –

+0

@BatCoder: Кто предлагает начать что-нибудь с нуля? Он просит просто использовать контейнер нормальной последовательности, такой как 'std :: vector' или' std :: deque', как стек или очередь, так как они, конечно, отлично способны обслуживать эти функции. –

ответ

5

To limit the user interface Вы не хотите, чтобы ваш стек мог удалять элементы где-то еще, а не сверху. Почему использовать вектор вместо стека, если у вас точно такая же производительность, стек также улучшает читаемость и надежность.

std::stack более выразителен, чем std::vector, когда контейнер, который вы хотите реализовать, действительно является LIFO.

+0

Почему дороже? –

+1

'экспрессивный' не' дорогой' – Deepanshu

3
  1. Для удобства. Они предоставляют семантический API, соответствующий потребностям.

  2. Читаемость. stack.top() выглядит лучше, чем stack[0], или stack[stack.size()] *, или stack.back(). Читателю такого кода не нужно толковать смысл такой конструкции. Это дано.

* Примечание: Как @moooeeeep предполагают, что это должно быть size()-1 если что-нибудь, но я оставляю оригинал как хороший пример, почему следует использовать поставляемые решения вместо того, чтобы писать даже самые простые вещи вручную.

+0

Также само название также дает хорошее представление о том, как их следует использовать и что они делают под капотом. – Namoshek

+1

или 'stack [stack.size() - 1]' – moooeeeep

+0

. @ Moooeeeep О, мой плохой! * blushy редактирование *. Кстати, это еще одна отличная причина. – luk32

1

std::stack является адаптером для контейнеров (может быть вектор, список контейнера whatsnut). Основная цель - преобразовать интерфейс базового контейнера в один из стека. Таких дающих push(), top() и pop() вместо push_back(), back() и pop_back().

Queue and deque следуют той же схеме. Очередь - это дека с меньшими возможными операциями.

Смежные вопросы