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::list
o std::deque
no. 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::list
e std::deque
forniscono 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 list
deve 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 deque
dovrebbe 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 deque
alloca 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 deque
sarà 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, deque
dovrebbe 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 deque
in un test e list
nell'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 list
o deque
causi 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 queue
effettua. 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 queue
non 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.