Vektoren haben zwei "Längen" -Attribute, die unterschiedliche Bedeutungen haben:
size
ist die Anzahl der verwendbaren Elemente im Vektor. Dies ist die Anzahl der Dinge, die Sie gespeichert haben. Dies ist eine konzeptionelle Länge.
capacity
ist, wie viele Elemente in die Speichermenge passen würden, die der Vektor aktuell zugewiesen hat.
capacity >= size
muss immer wahr sein, aber es gibt keinen Grund dafür, dass sie immer gleich sind. Wenn Sie beispielsweise ein Element entfernen, müssen Sie zum Verkleinern der Zuordnung eine neue Zuordnung erstellen, die einen Bucket kleiner ist, und den verbleibenden Inhalt verschieben ("Zuweisen, Verschieben, Frei").
Wenn capacity == size
Sie ein Element hinzufügen, kann der Vektor die Zuordnung um ein Element erhöhen (eine weitere Operation "Zuweisen, Verschieben, Frei"), aber normalerweise fügen Sie mehr als ein Element hinzu. Wenn die Kapazität erhöht werden muss, erhöht der Vektor seine Kapazität um mehr als ein Element, sodass Sie mehrere weitere Elemente hinzufügen können, bevor Sie alles erneut verschieben müssen.
Mit diesem Wissen können wir Ihre Frage beantworten:
std::vector<T>::resize()
Ändert die Größe des Arrays. Wenn Sie die Größe kleiner als die aktuelle Größe ändern, werden die überschüssigen Objekte zerstört. Wenn Sie die Größe größer als die aktuelle Größe ändern, werden die am Ende hinzugefügten "neuen" Objekte standardmäßig initialisiert.
std::vector<T>::shrink_to_fit()
fordert Sie auf, die Kapazität an die aktuelle Größe anzupassen. (Implementierungen können diese Anforderung erfüllen oder nicht . Sie verringern möglicherweise die Kapazität, machen sie jedoch nicht gleich der Größe. Sie tun möglicherweise überhaupt nichts.) Wenn die Anforderung erfüllt ist, werden einige oder alle nicht verwendeten Teile von verworfen die Zuordnung des Vektors. Normalerweise verwenden Sie diese Option, wenn Sie mit dem Erstellen eines Vektors fertig sind und niemals ein weiteres Element hinzufügen. (Wenn Sie im Voraus wissen, wie viele Elemente Sie hinzufügen werden, ist es besser std::vector<T>::reserve()
, den Vektor vor dem Hinzufügen von Elementen mitzuteilen, anstatt sich auf shrink_to_fit
irgendetwas zu verlassen.)
Sie können also resize()
ändern, wie viel Material konzeptionell im Vektor enthalten ist.
Sie können shrink_to_fit()
den überschüssigen Speicherplatz minimieren, den der Vektor intern zugewiesen hat, ohne zu ändern, wie viel Material sich konzeptionell im Vektor befindet.