Como há uma infinidade de respostas, você pode ficar confuso, mas para resumir:
Use um std::queue
. A razão para isso é simples: é uma estrutura FIFO. Você quer FIFO, você usa um std::queue
.
Ele deixa sua intenção clara para qualquer outra pessoa, e até para você mesmo. A std::list
ou std::deque
não. Uma lista pode inserir e remover em qualquer lugar, o que não é o que uma estrutura FIFO deve fazer, e um deque
pode adicionar e remover de qualquer uma das extremidades, o que também é algo que uma estrutura FIFO não pode fazer.
É por isso que você deve usar a queue
.
Agora, você perguntou sobre o desempenho. Em primeiro lugar, lembre-se sempre desta importante regra prática : Bom código primeiro, desempenho por último.
A razão para isso é simples: pessoas que buscam desempenho antes da limpeza e elegância quase sempre terminam por último. O código deles se torna uma massa de mingau, porque eles abandonaram tudo o que era bom para realmente não conseguir nada com isso.
Escrevendo um código bom e legível primeiro, a maioria dos problemas de desempenho se resolverá por si mesmos. E se mais tarde você descobrir que seu desempenho está deficiente, agora é fácil adicionar um criador de perfil ao seu código bom e limpo e descobrir onde está o problema.
Dito isso, std::queue
é apenas um adaptador. Ele fornece a interface segura, mas usa um contêiner diferente no interior. Você pode escolher esse contêiner subjacente e isso permite uma boa dose de flexibilidade.
Então, qual contêiner subjacente você deve usar? Sabemos que std::list
e std::deque
ambos fornecem as funções necessárias ( push_back()
, pop_front()
e front()
), então como é que vamos decidir?
Em primeiro lugar, entenda que alocar (e desalocar) memória não é algo rápido de se fazer, geralmente, porque envolve ir ao SO e pedir que ele faça algo. A list
precisa alocar memória toda vez que algo é adicionado e desalocá-lo quando ele for removido.
A deque
, por outro lado, aloca em blocos. Ele alocará com menos frequência do que a list
. Pense nisso como uma lista, mas cada bloco de memória pode conter vários nós. (Claro, sugiro que você realmente aprenda como funciona .)
Então, só com isso um deque
deveria ter um desempenho melhor, porque não lida com a memória com tanta frequência. Combinado com o fato de você estar manipulando dados de tamanho constante, provavelmente não será necessário alocar após a primeira passagem pelos dados, enquanto uma lista estará constantemente alocando e desalocando.
Uma segunda coisa a entender é o desempenho do cache . Ir para a RAM é lento, então quando a CPU realmente precisa, ela tira o melhor proveito desse tempo, levando um pedaço de memória de volta para o cache. Como um deque
aloca em pedaços de memória, é provável que acessar um elemento neste contêiner fará com que a CPU traga de volta o resto do contêiner também. Agora, qualquer outro acesso ao deque
será rápido, porque os dados estão no cache.
Isso é diferente de uma lista, onde os dados são alocados um de cada vez. Isso significa que os dados podem ser espalhados por todo o lugar na memória, e o desempenho do cache será ruim.
Portanto, considerando isso, a deque
deve ser uma escolha melhor. É por isso que é o contêiner padrão ao usar um queue
. Dito isso, este ainda é apenas um palpite (muito) educado: você terá que traçar o perfil deste código, usando um deque
em um teste e list
no outro para realmente saber com certeza.
Mas lembre-se: faça o código funcionar com uma interface limpa e se preocupe com o desempenho.
John levanta a preocupação de que envolver um list
ou deque
causará uma diminuição no desempenho. Mais uma vez, ele e eu podemos dizer com certeza sem criar o perfil, mas as chances são de que o compilador irá embutir as chamadas que ele queue
faz. Ou seja, quando você diz queue.push()
, ele realmente apenas diz queue.container.push_back()
, ignorando completamente a chamada de função.
Mais uma vez, essa é apenas uma suposição educada, mas usar um queue
não prejudicará o desempenho, quando comparado ao uso do contêiner básico bruto. Como eu disse antes, use o queue
, porque é limpo, fácil de usar e seguro, e se realmente se torna um problema, perfil e teste.