Зачем использовать std::stack
или std::queue
, а не std::vector
или std::deque
?Зачем использовать std :: stack или std :: queue?
Поскольку адаптеры контейнера - это просто обертки вокруг стандартных контейнеров, зачем их использовать?
Зачем использовать std::stack
или std::queue
, а не std::vector
или std::deque
?Зачем использовать std :: stack или std :: queue?
Поскольку адаптеры контейнера - это просто обертки вокруг стандартных контейнеров, зачем их использовать?
To limit the user interface
Вы не хотите, чтобы ваш стек мог удалять элементы где-то еще, а не сверху. Почему использовать вектор вместо стека, если у вас точно такая же производительность, стек также улучшает читаемость и надежность.
std::stack
более выразителен, чем std::vector
, когда контейнер, который вы хотите реализовать, действительно является LIFO
.
Почему дороже? –
'экспрессивный' не' дорогой' – Deepanshu
Для удобства. Они предоставляют семантический API, соответствующий потребностям.
Читаемость. stack.top()
выглядит лучше, чем stack[0]
, или stack[stack.size()]
*, или stack.back()
. Читателю такого кода не нужно толковать смысл такой конструкции. Это дано.
* Примечание: Как @moooeeeep предполагают, что это должно быть size()-1
если что-нибудь, но я оставляю оригинал как хороший пример, почему следует использовать поставляемые решения вместо того, чтобы писать даже самые простые вещи вручную.
std::stack
является адаптером для контейнеров (может быть вектор, список контейнера whatsnut). Основная цель - преобразовать интерфейс базового контейнера в один из стека. Таких дающих push()
, top()
и pop()
вместо push_back()
, back()
и pop_back()
.
Queue and deque следуют той же схеме. Очередь - это дека с меньшими возможными операциями.
Потому что есть алгоритмы, которые работают с использованием стеков и очередей. Почему бы не использовать их при попытке использовать список/вектор и рефакторинг всех ваших алгоритмов? Если я серьезно не пропущу что-то здесь. –
Просто, чтобы предотвратить * повторное изобретательство колеса *. Верно, что мы можем добиться всего, но почему что-то с нуля, если имеется другой вариант? Кроме того, начиная с нуля может сделать наш индивидуально разработанный код ошибкой и ошибкой. –
@BatCoder: Кто предлагает начать что-нибудь с нуля? Он просит просто использовать контейнер нормальной последовательности, такой как 'std :: vector' или' std :: deque', как стек или очередь, так как они, конечно, отлично способны обслуживать эти функции. –