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
Antwort
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.
Oder mit MFC, seine Array (dh Vektor) -Klasse hat eine setsize, dass es effektiv eine Größenänderung –
Ich weiß nicht über MFC-Container, der OP sagte Vektor, so nahm ich an, sie bedeuten 'std :: vector
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()).
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.
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()'
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. –
- 1. Unbekannte Größe Vektor Eingabe
- 2. Vektor mit konstanter Größe
- 3. Initialisierungsliste vs. Vektor
- 4. Scala - TrieMap vs Vektor
- 5. Vektor vs Sammlungen.synchronizedList (ArrayList)
- 6. Vektor vs Array Leistung
- 7. Ändern der Größe mehrdimensionalen Vektor
- 8. Clojure Liste vs. Vektor vs. Set
- 9. Vektor vs. Datenrahmen in R
- 10. np.full (Größe, 0) vs. np.zeros (Größe) vs. np.empty()
- 11. Klar UIPasteBoard
- 12. Std :: Vektor Größe nach unten verkleinern
- 13. Größe des Arrays von Std :: Vektor
- 14. EASTL Vektor-Design auf Größe() Methode
- 15. Erstellen Sie neue feste Größe Vektor
- 16. STL-Vektor: die Größe() und assign()
- 17. Benutzerdefinierte Reduktion auf Vektor unterschiedlicher Größe
- 18. Was ist Tuple? Und Tupel vs. Liste vs. Vektor?
- 19. push_back vs emplace vs Einfügen in Vektor in C++
- 20. Power vs Effect Größe plot
- 21. Iteratorzugriffsleistung für STL-Karte vs. Vektor?
- 22. MapBox MB Tile vs Vektor Tile
- 23. C++ std :: Vektor emplace vs einfügen
- 24. Deque vs Vektor Anleitung nach C++ 11 Verbesserungen
- 25. Klar Array von Strings
- 26. Leinwand Klar in Paper.js
- 27. Symfony2 Lehre klar Cache
- 28. Matrix Berechnung klar verstehen
- 29. sql beitreten klar php
- 30. iPhone klar CGContext
können Sie versuchen, es in beide Richtungen und uns sagen, wie es gelaufen ist? –
angenommen, du meinst 'resize (0)'? – Roddy