2014-11-12 21 views
7

I vettori raddoppiano le loro dimensioni ogni volta che esauriscono lo spazio quando si aggiunge un elemento, ma per quanto riguarda la rimozione degli elementi? diciamo che hai aggiunto 800 elementi a un array e, con l'aggiunta dell'elemento 800, il vettore raddoppia le sue dimensioni per poter contenere 1600 elementi. Ora, cosa succede se inizi a togliere elementi al punto che la sua unica detenzione dice 5 o 10 elementi?I vettori Do (C++) si restringono dopo la rimozione degli elementi?

riconoscerà che il vettore è molto più piccolo della metà delle dimensioni dello spazio riservato agli elementi futuri e riserva meno spazio?

+6

Utilizzare 'shrink_to_fit' se è necessario" garantire "questo (si noti che * può * tecnicamente essere ignorato, ma non credo che nulla lo sia). – chris

+1

La risposta breve è no - 'erase() 'non riduce' capacity() '. –

+1

E nemmeno 'clear()'. – bialpio

risposta

6

I vettori non diminuiscono di capacità quando si rimuovono gli elementi! Questo per consentire l'aggiunta di elementi futuri nel buffer esistente.

+0

Non è l'unico modo: vec.resize (vec.size()); ' bialpio

+0

Whoops, mi dispiace. Hai ragione. – bialpio

+0

Si prega di smettere di diffondere il mito che il trucco di riduzione della capacità è qualcosa di diverso da [una soluzione best-effort] (http://stackoverflow.com/q/7829018/560648)! –

1

Se ha già assegnato un blocco di memoria, continuerà a utilizzarlo perché sarebbe inefficiente per liberare memoria e successivamente dovrà allocare più memoria.

Raccomando sempre di scrivere uno snippet di codice di test per testare questo genere di cose.

Per esempio, ho buttato questo insieme in 2 minuti per verificare che vi dicevo informazioni corrette:

#include <iostream> 
#include <vector> 

void printInfo(std::vector<char> &_vector) 
{ 
    std::cout << "Size: " << _vector.size() << std::endl; 
    std::cout << "Capacity: " << _vector.capacity() << std::endl; 
    std::cout << std::endl; 
} 

int main() 
{ 
    int numbElems = 10; 
    std::vector<char> myvector; 

    std::cout << "Nothing entered" << std::endl; 
    printInfo(myvector); 

    for (int i = 0; i < 10; i++) { 
    for (int c = 0; c < numbElems; c++) { 
     myvector.push_back(i); 
    } 
    std::cout << "Pushed " << numbElems << std::endl; 
    printInfo(myvector); 
    } 

    for (int i = 0; i < 5; i++) { 
    for (int c = 0; c < numbElems; c++) { 
     myvector.pop_back(); 
    } 
    std::cout << "Popped " << numbElems << std::endl; 
    printInfo(myvector); 
    } 

    myvector.erase(myvector.begin(), myvector.end()); 
    printInfo(myvector); 

    std::cout << "max_size: " << myvector.max_size() << std::endl; 

    return 0; 
} 

Se compilate ed eseguite vedrete Capacità non scende in termini di dimensioni. Anche dopo la cancellazione, o alcuni elementi vengono rimossi.

Su linux è possibile utilizzare less per scorrere l'output.

+0

Ciò lo dimostra sul tuo compilatore. È necessario fare riferimento alle specifiche per dimostrarlo. –

+0

Ho dimenticato di dirlo. Sto usando 'g ++' della raccolta del compilatore GNU. Non sei sicuro di come farlo correttamente. Ma sì, dipende dall'implementazione del vettore. –

Problemi correlati