2010-04-29 18 views
5

Ho letto su Internet che se si sta pulendo ripetutamente un std::vector (in un circuito chiuso), potrebbe essere preferibile utilizzare resize(0) anziché clear(), poiché potrebbe essere più veloce. Non sono sicuro di questo. Qualcuno ha una risposta definitiva a questo?Vector clear vs. ridimensiona

+1

Puoi provare entrambi i modi e dirci come è andata? –

+0

si suppone che tu voglia 'ridimensionare (0)'? – Roddy

risposta

13

suppongo che voi dire resize(0) invece di setsize, e chiamando che invece di clear(), e che si sta parlando std::vector. IIRC una recente risposta ha discusso di questo (non riesce a trovare il collegamento) e sulle moderne implementazioni STL, clear() è probabilmente identico a resize(0).

In precedenza, la cancellazione di un vettore avrebbe potuto liberare tutta la sua memoria (ovvero la sua capacità si riduce anche a zero), causando riallocazioni quando si ricominciano ad aggiungere elementi, al contrario di resize(0) mantenendo la capacità in modo tale che ci siano meno riallocazioni. Tuttavia, penso che nelle moderne librerie STL non ci siano differenze. Se stai usando una vecchia implementazione STL, o sei solo paranoico, resize(0) potrebbe essere più veloce.

+0

O usando MFC, la sua classe array (ie vector) ha un setize che è effettivamente ridimensionabile –

+0

Non conosco i contenitori di MFC, il vettore OP detto così ho pensato che intendessero 'std :: vector '. – AshleysBrain

1

Questa implementazione sonora specifica ed è un lavoro per te, la tua libreria e un profiler. Ma a quanto vedo, non riesco a capire perché ridimensionare (0) dovrebbe essere più veloce quando entrambi avranno effettivamente bisogno di chiamare cancella (begin(), end()).

2

Guardando alla fonte STL Dinkumware, sia chiamare in modo efficace erase(begin(), end());

clear() è leggermente più efficiente, ovviamente., In quanto ha solo un caso da affrontare. ma non mi aspetterei che sia misurabile.

0

Sembra esserci una differenza tra il chiaro e il ridimensionamento (0) quando il vettore contiene oggetti di una classe che non ha un costruttore predefinito. Ad esempio, il seguente codice compilerà:

#include <vector> 

class A { 
private: 
    int x,y; 
public: 
    A(int x,int y) :x(x), y(y) {} 
}; 

int main() { 
    std::vector <A> aa; 

    aa.clear(); 
} 

Ma se si sostituisce la aa.clear() da aa.resize(0), si ottiene errore di compilazione:

error: no matching function for call to 'A::A()' 
+0

Suppongo che ciò sia dovuto al fatto che ridimensionare ha bisogno del costruttore predefinito in modo che possa predefinire la costruzione di nuovi elementi se si sta ridimensionando una dimensione maggiore della dimensione corrente. –