Uma vez que as únicas operações necessárias para que um contêiner seja usado em uma pilha são:
- costas()
- retrocesso()
- pop_back ()
Por que o contêiner padrão para ele é um deque em vez de um vetor?
As realocações deque não fornecem um buffer de elementos antes de front () para que push_front () seja uma operação eficiente? Esses elementos não são desperdiçados, já que nunca serão usados no contexto de uma pilha?
Se não houver sobrecarga para usar um deque dessa maneira em vez de um vetor, por que o padrão para priority_queue é um vetor e não um deque também? (priority_queue requer front (), push_back () e pop_back () - essencialmente o mesmo que para pilha)
Atualizado com base nas respostas abaixo:
Parece que a maneira como o deque é geralmente implementado é uma matriz de tamanho variável de matrizes de tamanho fixo. Isso torna o crescimento mais rápido do que um vetor (o que requer realocação e cópia), então, para algo como uma pilha que envolve adicionar e remover elementos, o deque é provavelmente uma escolha melhor.
priority_queue requer muita indexação, já que toda remoção e inserção requer que você execute pop_heap () ou push_heap (). Isso provavelmente torna o vetor uma escolha melhor, já que adicionar um elemento ainda é uma constante amortizada de qualquer maneira.
fonte
Respostas:
Conforme o contêiner cresce, uma realocação de um vetor requer a cópia de todos os elementos para o novo bloco de memória. Aumentar um deque aloca um novo bloco e o vincula à lista de blocos - nenhuma cópia é necessária.
Claro, você pode especificar que um contêiner de apoio diferente seja usado, se desejar. Portanto, se você tem uma pilha que sabe que não vai crescer muito, diga a ela para usar um vetor em vez de um deque, se essa for sua preferência.
fonte
std::deque
que para a qual éstd::vector
, e essas operações provavelmente serão usadas com muito mais frequência do que realocações. Eu tenho dificuldade em acreditar questd::deque
algum dia seria melhorstd::vector
na prática.list
, por quêdeque
?std::deque
que tem uma chance de vencerstd::vector
na prática, ou quer dizer que ainda duvida? obrigado.std::deque
funcionará tão bem quantostd::vector
em aplicações práticas. Mas, para valer a pena, minha experiência pessoal é que preciso empilhar e enfileirar estruturas de dados não para uma tarefa grande e crucial para a complexidade, mas para muitas pequenas ocasiões espalhadas por meu código. Como tal, preocupo-me mais com o comportamento nas pequenas do que nas grandes; e deque brilha particularmente maçante lá. Minha preferência é não usar nenhum dos dois, mas apenas listas vinculadas individualmente (autoimplementadas). Mas sua milhagem pode variar.Consulte o Guru da Semana 54 de Herb Sutter para os méritos relativos do vetor e deque onde qualquer um deles serviria.
Imagino que a inconsistência entre priority_queue e queue é simplesmente que diferentes pessoas os implementaram.
fonte
priority_queue
deve permanecer classificado, de forma que a maior sobrecarga do acesso aleatóriodeque::iterator
seja mais problemática.priority_queue
tem uma "ordem mágica" que é mantida, não é classificada. No entanto, seu ponto permanece.