2015-03-20 13 views
5

Quando un vettore C++ riduce in modo dinamico le dimensioni allocate nella pratica.Dimensioni di allocazione ridotte del vettore C++

So che lo spazio allocato raddoppia su un inserto in un vettore completo, ma non mi è chiaro quando l'allocazione è ridotta. L'isteresi classica consiste nel dimezzare la dimensione dell'allocazione dopo la rimozione da un vettore completo di 1/4.

+1

Lo standard non lo fa conferire la capacità di raddoppiare la riallocazione. Significa solo che la crescita deve essere geometrica per ottenere l'inserimento del tempo costante ammortizzato. Ma qualsiasi fattore di crescita α> 1 si qualificherà per quello. – 5gon12eder

risposta

7

Non ridurrà mai la memoria allocata in assenza di una direzione esplicita per farlo.

In C++ 11 è presente una chiamata shrink_to_fit che richiederà l'implementazione per eseguire questa operazione, ma potrebbe non ridurre la memoria allocata. Nelle versioni precedenti devi creare una nuova copia e sostituire quella vecchia.

+3

anche 'shrink_to_fit' non è garantito per ridurre la capacità (è una richiesta non vincolante). – vsoftco

+1

La tecnica delle "versioni precedenti" avrà comunemente la forma 'std :: vector (vec) .swap (vec);' –

+2

@DrewDormann: [E loro_still_ non mantengono alcuna garanzia!] (Http: // stackoverflow .com/q/7829018/560648) –

2

Almeno nel mio compilatore, i vettori non sembrano ridurre il loro spazio allocato. Quando eseguo:

 std::vector<int> v; 
     for(unsigned x=0;x<20;++x) 
     { 
      v.push_back(x); 
      out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl; 
     } 
     for(unsigned x=v.size();x>0;--x) 
     { 
      v.pop_back(); 
      out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl; 
     } 

cosa viene restituito è:

elements: 1, capacity: 1 
    elements: 2, capacity: 2 
    elements: 3, capacity: 4 
    elements: 4, capacity: 4 
    elements: 5, capacity: 8 
    elements: 6, capacity: 8 
    elements: 7, capacity: 8 
    elements: 8, capacity: 8 
    elements: 9, capacity: 16 
    elements: 10, capacity: 16 
    elements: 11, capacity: 16 
    elements: 12, capacity: 16 
    elements: 13, capacity: 16 
    elements: 14, capacity: 16 
    elements: 15, capacity: 16 
    elements: 16, capacity: 16 
    elements: 17, capacity: 32 
    elements: 18, capacity: 32 
    elements: 19, capacity: 32 
    elements: 20, capacity: 32 
    elements: 19, capacity: 32 
    elements: 18, capacity: 32 
    elements: 17, capacity: 32 
    elements: 16, capacity: 32 
    elements: 15, capacity: 32 
    elements: 14, capacity: 32 
    elements: 13, capacity: 32 
    elements: 12, capacity: 32 
    elements: 11, capacity: 32 
    elements: 10, capacity: 32 
    elements: 9, capacity: 32 
    elements: 8, capacity: 32 
    elements: 7, capacity: 32 
    elements: 6, capacity: 32 
    elements: 5, capacity: 32 
    elements: 4, capacity: 32 
    elements: 3, capacity: 32 
    elements: 2, capacity: 32 
    elements: 1, capacity: 32 
    elements: 0, capacity: 32 
+0

non riducono automaticamente la capacità per motivi di ottimizzazione (richiede tempo). – vsoftco

0

Befor C++ 11 si potrebbe svuotare vettore assegnandogli un nuovo valore:

vector<int> x; 
x.resize(500); 
x = vector<int>(); // assigning a copy of new empty vector will shrink memory usage