Sie können den Vektor tauschen wie andere vorgeschlagen haben, und wie in http://www.gotw.ca/gotw/054.htm aber bewusst sein, beschrieben, dass es nicht frei, du bist eine Kopie jedes Elements durchführen, weil der Vektor einen neuen zuzuweisen hat, kleiner , Stück Speicher, und kopieren Sie alle alten Inhalte über. (Die Swap-Operation ist im Wesentlichen frei, aber Sie tauschen mit einem temporären mit einer Kopie der ursprünglichen Vektors Daten initialisiert, die nicht frei ist)
Wenn Sie im Voraus wissen, wie groß der Vektor ist, sollten Sie zuteilen, die richtige Größe zu beginnen, so dass keine Größenänderung ist notwendig:
std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements
Und wenn Sie nicht die Kapazität im Voraus wissen, warum es keine Rolle, ob es ein wenig Platz verschwendet? Lohnt es sich, jedes Element in einen neuen und kleineren Vektor zu kopieren (was std :: vector (v) .swap (v) tun wird), nur um ein paar Kilobyte Speicher zu sparen?
In ähnlicher Weise, wenn Sie den Vektor löschen, wenn Sie beabsichtigen, es auf jeden Fall zu füllen, scheint es eine beeindruckende Verschwendung von Zeit, seine Kapazität auf Null einzustellen.
bearbeiten:
baash05: Was ist, wenn Sie ein 10 MB RAM 1000000 Artikel hatte.würden Sie sagen Reduzierung der Overhead ist wichtig?
Nr den Vektor Ändern der Größe erfordert mehr Speicher, vorübergehend, wenn Sie also speicher begrenzt sind, das könnte Ihre Anwendung brechen. (Sie müssen den Originalvektor im Speicher haben, und das temporäre, bevor Sie sie austauschen können, so dass Sie bis zu doppelt so viel RAM an diesem Punkt verwenden). Danach können Sie eine kleine Menge an Speicher speichern (bis zu ein paar MB), aber das ist egal, weil die überschüssige Kapazität im Vektor niemals aufgerufen würde, also würde es in die Auslagerungsdatei geschoben werden, und so nicht zählen Sie in erster Linie auf Ihr RAM-Limit.
Wenn Sie 1000000 Elemente haben, dann sollten Sie den Vektor auf die richtige Größe an erster Stelle initialisieren.
Und wenn Sie das nicht können, dann ist es normalerweise besser, die Kapazität allein zu lassen. Vor allem, da Sie angegeben haben, dass Sie den Vektor nachfüllen werden, sollten Sie die Kapazität, die bereits zugewiesen wurde, definitiv wiederverwenden, anstatt alles ständig zuzuordnen, neu zuzuordnen, zu kopieren und freizugeben.
Sie haben zwei mögliche Fälle. Entweder Sie wissen, wie viele Elemente Sie speichern müssen oder nicht. Wenn Sie wissen, dann können Sie den Vektor mit der richtigen Größe an erster Stelle erstellen, und so müssen Sie nie die Größe ändern, oder Sie wissen nicht, und dann können Sie genauso gut die überschüssige Kapazität behalten, so zumindest muss nicht nach oben angepasst werden, wenn Sie Ihren Vektor nachfüllen.
Ist Ihr System nicht genügend Speicher? Reservieren bedeutet, dass das Hinzufügen von n Objekten 0 (n^2) Zeit und höchstens n + 100 Objekte mit Leerzeichen plus Rundungsfehler verwendet. Wenn der Vektor sich selbst erweitern würde, wäre weniger Code, O (n) Zeit, und bei den meisten Implementierungen wird höchstens 2 * n Leerzeichen plus Rundung verwendet. –
Mein System ist sehr kurz im Speicher. (Eingebettet) .. Der Code war wirklich nur ein Beispiel für das, was ich irgendwie implementieren möchte. Zum größten Teil bekomme ich 1000 Item Chunks von der "Tabelle", so dass es sinnvoll ist, die Größe in der gleichen Häufigkeit zu ändern. Die Reinigung war mein Hauptanliegen. – baash05