Poiché ci sono una miriade di risposte, potresti essere confuso, ma per riassumere:
Usa un file std::queue. Il motivo è semplice: si tratta di una struttura FIFO. Vuoi FIFO, usi un filestd::queue .
Rende chiaro il tuo intento a chiunque altro, e anche a te stesso. A std::listo std::dequeno. Un elenco può inserire e rimuovere ovunque, il che non è ciò che una struttura FIFO dovrebbe fare, e un filedeque può aggiungere e rimuovere da entrambe le estremità, cosa che anche una struttura FIFO non può fare.
Questo è il motivo per cui dovresti usare un file queue .
Ora, hai chiesto delle prestazioni. In primo luogo, ricorda sempre questa importante regola pratica: prima un buon codice, infine le prestazioni.
Il motivo è semplice: le persone che aspirano alle prestazioni prima che la pulizia e l'eleganza finiscano quasi sempre per ultime. Il loro codice diventa una poltiglia, perché hanno abbandonato tutto ciò che è buono per non ricavarne davvero nulla.
Scrivendo prima un codice valido e leggibile, la maggior parte di voi problemi di prestazioni si risolverà da sola. E se in seguito scopri che le tue prestazioni sono carenti, ora è facile aggiungere un profiler al tuo codice bello e pulito e scoprire dove si trova il problema.
Detto questo, std::queueè solo un adattatore. Fornisce l'interfaccia sicura, ma utilizza un contenitore diverso all'interno. È possibile scegliere questo contenitore sottostante e ciò consente una buona dose di flessibilità.
Quindi, quale contenitore sottostante dovresti usare? Sappiamo che std::liste std::dequeforniscono entrambi le funzioni necessarie ( push_back(), pop_front(), e front()), quindi come facciamo a decidere?
In primo luogo, capire che l'allocazione (e la deallocazione) della memoria non è una cosa rapida da fare, in generale, perché implica uscire dal sistema operativo e chiedergli di fare qualcosa. A listdeve allocare la memoria ogni volta che viene aggiunto qualcosa e rilasciarla quando scompare.
A deque, d'altra parte, alloca in blocchi. Assegnerà meno spesso di un file list. Consideralo un elenco, ma ogni pezzo di memoria può contenere più nodi. (Ovviamente, ti suggerirei di imparare davvero come funziona .)
Quindi, solo con questo a dequedovrebbe funzionare meglio, perché non ha a che fare con la memoria così spesso. Mescolato con il fatto che stai gestendo dati di dimensioni costanti, probabilmente non sarà necessario allocare dopo il primo passaggio attraverso i dati, mentre un elenco verrà costantemente allocato e deallocato.
Una seconda cosa da capire sono le prestazioni della cache . Uscire dalla RAM è lento, quindi quando la CPU ne ha davvero bisogno, sfrutta al meglio questo tempo riportando con sé un pezzo di memoria nella cache. Poiché a dequealloca in blocchi di memoria, è probabile che l'accesso a un elemento in questo contenitore indurrà la CPU a ripristinare anche il resto del contenitore. Ora ogni ulteriore accesso al dequesarà veloce, perché i dati sono nella cache.
Questo è diverso da un elenco, in cui i dati vengono allocati uno alla volta. Ciò significa che i dati potrebbero essere distribuiti ovunque nella memoria e le prestazioni della cache saranno ridotte.
Quindi, considerando questo, dequedovrebbe essere una scelta migliore. Questo è il motivo per cui è il contenitore predefinito quando si utilizza un file queue. Detto questo, questa è ancora solo un'ipotesi (molto) plausibile: dovrai profilare questo codice, usando un dequein un test e listnell'altro per sapere con certezza.
Ma ricorda: fai funzionare il codice con un'interfaccia pulita, quindi preoccupati delle prestazioni.
John solleva la preoccupazione che il wrapping di un listo dequecausi una diminuzione delle prestazioni. Ancora una volta, né lui né io possiamo dirlo con certezza senza profilarlo noi stessi, ma è probabile che il compilatore inserisca le chiamate che queueeffettua. Cioè, quando dici queue.push(), dirà solo queue.container.push_back(), saltando completamente la chiamata alla funzione.
Ancora una volta, questa è solo un'ipotesi plausibile, ma l'utilizzo di a queuenon ridurrà le prestazioni, rispetto all'utilizzo del contenitore sottostante grezzo. Come ho detto prima, usa il queue, perché è pulito, facile da usare e sicuro, e se diventa davvero un problema, profilo e prova.