Domanda

Facendo riferimento all'art Gotw 54 di HerbSutter, spiega

  1. Il modo giusto per "restringersi" un vettore o un deque

  2. Il modo giusto per cancellare completamente un vettore o un deque

Possiamo semplicemente usare container.resize()E container.clear() Per l'attività di cui sopra o mi manca qualcosa?

È stato utile?

Soluzione

Ci sono due cose diverse che un vettore contiene: size Contro capacity.Se solo resize del vettore, non vi è alcuna garanzia che la capacità (quanta memoria è riservata) debba cambiare. resize è un'operazione che riguarda quanto stai utilizzando, non la capacità del vettore.

Quindi per esempio.

size     == how much you are using
capacity == how much memory is reserved
vector<int> v(10);

v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear()    // size == 0 but capacity (may or may) not be changed

Alla fine, la capacità non dovrebbe essere modificata a ogni operazione, poiché ciò comporterebbe un notevole sovraccarico di allocazione/deallocazione della memoria.Sta dicendo che se ne hai bisogno "deallocare" IL memoria riservata per vettore, fallo.

Altri suggerimenti

Né ridimensionare (), né di lavoro chiaro (). La .capacity() di un vettore è garantito per essere almeno grande quanto la size() corrente del vettore, e garantito almeno grande quanto la capacità reserve()d. Inoltre, questo .capacity() non si restringe, così è anche almeno grande come qualsiasi size() precedente o reserve()ation.

Ora, la .capacity() di un vettore è solo la memoria che ha riservato. Spesso non tutti che la memoria cotains oggetti. Il ridimensionamento rimuove gli oggetti, ma non riciclare la memoria. Un vettore può riciclare solo il suo buffer di memoria per allocare un buffer più grande.

Il trucco di swap funziona copiando tutti ogetti ad un buffer di memoria più piccola, più appropriato. Successivamente, il buffer di memoria originale può essere riciclato. Questo sembra violare la precedente affermazione che il buffer di memoria di un vettore può solo crescere. Tuttavia, con il trucco di swap, si ha temporaneamente 2 vettori.

Il vettore ha dimensioni e capacità. Essa può contenere elementi X ma hanno memoria non inizializzata in deposito per elementi Y più. In una tipica implementazione cancellare, ridimensionare (quando si ridimensiona a dimensione più piccola) e chiaro non influenzano la capacità:. Il vettore mantiene la memoria intorno per sé, dovrebbe si desidera aggiungere nuovi elementi ad essa in un secondo momento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top