stavo leggendo deque
s vs vector
s, e mi sono imbattuto la sua wikipedia entry, che dice uno dei tre possibili implementazioni di deque
usando gli array dinamici è:ci sono deque o vettori di allocazione centrale nelle implementazioni STL?
Assegnazione contenuti deque dal centro della matrice sottostante, e ridimensionamento dell'array sottostante quando viene raggiunta una delle estremità. Questo approccio può richiedere ridimensionamenti più frequenti e sprecare più spazio, in particolare quando gli elementi vengono inseriti solo ad una estremità.
Mi chiedevo se esistono implementazioni STL (o STL) che utilizzano effettivamente questa strategia di allocazione centrale?
Sto chiedendo perché questa strategia sembra piuttosto allettante in quanto coinvolge solo un array sottostante, e quindi rimuove il problema di contiguità di memoria, che è probabilmente l'unico problema principale deque
rispetto a vector
. Se ho capito bene, questo potrebbe benissimo essere un sostituto per std::vector
che consente O (1) pop_front
(ammortizzato) o una sostituzione per deque
con garanzie di contiguità di memoria. Suppongo che questo sia al costo di raddoppiare lo spazio di buffering di uno std::vector
, che non è una preoccupazione importante per i miei casi d'uso.
Inoltre, è vero che l'inserimento/la cancellazione nel mezzo di un contenitore di questo tipo richiederebbe la metà del tempo di std::vector
in media?
UPDATE:
Come @Lightness gare in orbita rilevare, tale implementazione non sarà utilizzato in base agli standard attuali, perché nessuno può beneficiare dei pregi per contratto con STL e tutti soffriranno dalla aspetti negativi. Un'ulteriore domanda che ho per quanto riguarda i lati negativi è questo:
E 'possibile implementare un nuovavector
o deque
come contenitore (ad esempio bivector
) in modo che, oltre alle funzionalità/operatori di std::vector
,
1) fornisce (ammortizzato) il tempo costante push_front()
e le operazioni pop_front()
e
2) garantisce contiguità di memoria ma non validità di iteratore dopo dimensioni crescenti?
Immagino che con uno schieramento dietro la scena, molti dei problemi di indiretta/prestazioni su deque
andrebbero via.
Non avresti ancora bisogno di spostare il contenuto una volta raggiunto il limite dell'array per mantenere la contiguità? – Pradhan
Forse possiamo semplicemente riassegnare la memoria come 'std :: vector' fa quando viene raggiunta la sua estremità destra. Penso che il costo della ri-allocazione quando si calcola la media con inserti che non sfondano sia ammortizzato O (1) come con 'vector'. Immagino che possiamo fare il "trucco vettoriale" su entrambe le estremità ". – tinlyx