2010-04-29 24 views
5

Ich lese im Internet, dass, wenn Sie eine std::vector wiederholt löschen (in einer engen Schleife), könnte es besser sein, resize(0) anstelle von clear() zu verwenden, da es schneller sein kann. Da bin ich mir nicht sicher. Hat jemand eine definitive Antwort darauf?Vektor klar vs Größe

+1

können Sie versuchen, es in beide Richtungen und uns sagen, wie es gelaufen ist? –

+0

angenommen, du meinst 'resize (0)'? – Roddy

Antwort

13

Ich nehme an, Sie meinen resize(0) statt setsize, und fordern, dass anstelle von clear(), und dass Sie sprechen std::vector. IIRC eine aktuelle Antwort diskutiert dies (kann den Link nicht finden), und auf modernen STL-Implementierungen, clear() ist wahrscheinlich identisch mit resize(0).

Zuvor hat das Löschen eines Vektors möglicherweise seinen gesamten Speicher freigegeben (dh seine Kapazität fällt ebenfalls auf Null), was zu Neuzuweisungen führt, wenn Sie Elemente erneut hinzufügen, im Gegensatz zu resize(0) die Kapazität so beibehalten, dass es weniger Neuzuweisungen gibt. Ich denke jedoch, dass es in modernen STL-Bibliotheken keinen Unterschied gibt. Wenn Sie eine alte STL-Implementierung verwenden oder nur paranoid sind, ist resize(0) möglicherweise schneller.

+0

Oder mit MFC, seine Array (dh Vektor) -Klasse hat eine setsize, dass es effektiv eine Größenänderung –

+0

Ich weiß nicht über MFC-Container, der OP sagte Vektor, so nahm ich an, sie bedeuten 'std :: vector '. – AshleysBrain

1

Diese Sound-Implementierung spezifisch, und ist eine Aufgabe für Sie, Ihre Bibliothek und einen Profiler. Aber wie ich es sehe, kann ich nicht sehen, warum resize (0) schneller sein sollte, wenn beide in der Tat löschen müssen (begin(), end()).

2

Mit Blick auf Dinkumware AWL-Quelle, beide rufen effektiv erase(begin(), end());

clear() etwas effizienter ist, wenig überraschend., Da es mit nur den einen Fall zu tun hat. aber ich würde nicht erwarten, dass es messbar ist.

0

Es scheint einen Unterschied zwischen clear und resize (0) zu geben, wenn der Vektor Objekte einer Klasse enthält, die keinen Standardkonstruktor hat. Beispielsweise wird der folgende Code kompilieren:

#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(); 
} 

Aber wenn Sie die aa.clear() von aa.resize(0) ersetzen Sie Kompilierungsfehler erhalten:

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

Ich vermute, das liegt daran, dass die Größenanpassung den Standardkonstruktor benötigt, so dass neue Elemente standardmäßig erstellt werden können, wenn Sie die Größe auf eine Größe größer als die aktuelle Größe ändern. –