Non ho finora imparato come std::deque
sia implementato sotto il cofano e scoperto che si tratta di qualcosa come un array di puntatori agli array di n byte, in cui i dati vengono effettivamente memorizzati. Quindi ora ho un paio di domande relative ai deques.Come è implementato lo ordinamento per std :: deque?
Un quadro che descrive il mio stato attuale delle conoscenze la sua struttura:
Le domande sono:
Quando è in corso un'operazione di
push_front
e non c'è spazio libero nel blocco dati 0, un nuovo blocco dati è allocato su heap e un puntatore a questa memoria appena allocata viene inserito nell'array 'Map' come nell'array ordinario - in tempo O (numero_di_blocchi), sì?Come ordinare questa bestia? Non riesco ad immaginare niente di meglio quindi copia tutti i dati in un array, ordinalo e poi rimettilo in ordine. Ma questo approccio richiede O (n) memoria ausiliaria ... Ma!
std::sort
fornisce un'interfaccia simile per l'ordinamento sia distd::vector
e distd::deque
. Come vengono implementati diversi algoritmi per diverse strutture di dati? Utilizzando una specializzazione template? In tal caso, perchéstd::list
non può essere ordinato utilizzandostd::sort
? Oppure,std::sort
non si preoccupa della struttura interna di questi contenitori e utilizza solo iteratori e metodi, che sono simili sia instd::vector
estd::deque
(comeoperator[]
,size()
, ecc.)? Questa idea sembra ragionevole e una risposta a "perché non è possibile ordinarestd::list
?" diventa evidenteCome vengono scelte le dimensioni dei blocchi dati? Dirai "Dipende dall'implementazione", ma ti preghiamo di dire di più sulle diverse implementazioni e motivazioni dietro alle soluzioni.
Hai bisogno di chiarimenti qui. Grazie.
La matematica dietro di loro non regge, 'std :: deque' ha iteratori ad accesso casuale, e come tale qualsiasi algoritmo di ordinamento sul posto sarà in grado di ordinare i dati all'interno usando quella funzionalità e non richiedendo memoria O (N) aggiuntiva . 'std :: list' non fornisce l'iterazione di accesso casuale, e quindi non' std :: sort'-able. (è, tuttavia, 'std :: list :: sort'-able). Vedi la sezione ** Requisiti del tipo ** di [la documentazione di 'std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort). – WhozCraig
Manca lo schema dei contenitori STL <- Iterator -> Algoritmi. L'ordinamento è uguale a qualsiasi altro contenitore con iteratori ad accesso casuale. – 101010
'std :: sort' funziona su ** qualsiasi ** paio di * iteratori di accesso casuale *. Sia 'std :: vector' che' std :: deque' forniscono iteratori di accesso casuale, ma 'std :: list' no. Non c'è (necessariamente) alcuna magia di specializzazione del modello o qualcosa del genere, dato che 'std :: sort' funziona scambiando gli elementi nell'intervallo fornito; questo non richiede una memoria aggiuntiva significativa, e non richiede nemmeno una conoscenza specifica del container/intervallo/qualsiasi cosa dietro gli iteratori. – Mankarse