2016-08-16 2 views
12

Ich habe eine std::vector, auf der ich reserve mit einem großen Wert aufrufen. Danach erhalte ich data().Verwenden Sie std :: vector :: Daten nach Reserve

Da Iterieren data dann stürzt ich frage mich, ob das überhaupt erlaubt ist. Ist reserve gezwungen, data auf den zugewiesenen Speicherbereich zu aktualisieren?

+3

warum 'reserve' und nicht' resize'? 'reserve' weist nur Speicher zu," resize "Konstruktobjekte darin. –

+4

Können wir Ihren Code sehen? – wasthishelpful

+2

@ n.m Resize könnte so teuer sein. Reservieren wird garantieren, dass Sie Objekte später erneut platzieren können. –

Antwort

14

Die Garantie von reserve besteht darin, dass nachfolgende Einfügungen nicht neu zugeordnet werden und somit keine Ungültigmachung verursachen. Das ist es. Es gibt keine weiteren Garantien.

3

Es ist nicht erforderlich, dass data() den dereferencable-Zeiger für den leeren Vektor (size() == 0) zurückgibt, auch wenn er eine Nicht-Null-Kapazität hat. Es kann nullptr oder einen beliebigen Wert zurückgeben (nur in diesem Fall ist es erforderlich, dass es mit sich selbst verglichen werden kann und 0 hinzugefügt werden könnte, ohne UB aufzurufen).

10

Wird reserve gezwungen, data auf den zugewiesenen Speicherbereich zu aktualisieren?

Nein, der Standard nur gewährleistet, dass std::vector::data einen Zeiger zurückgibt und [data(), data() + size()) ist ein gültiger Bereich, der capacity ist nicht betroffen.

§23.3.11.4/1 vector data [vector.data]:

Returns: Ein Zeiger so, dass ein gültiger [data(), data() + size()) Bereich liegt. Für einen nicht leeren Vektor, data() == addressof(front()).

1

ich die documentation würde sagen, ist ziemlich klar zu diesem Thema: alles nach data() + size() kann zugewiesen, aber nicht initialisiert Speicher: wenn Sie wollen auch diesen Speicher initialisieren sollten Sie vector::resize verwenden.

void reserve (size_type n);

Anfrage eine Änderung

Requests in der Kapazität, die der Vektor Kapazität enthalten n Elemente zumindest ausreichen.

Wenn n größer als die aktuelle Vektorkapazität ist, bewirkt die Funktion, dass der Container seinen Speicher um neu zuweist und seine Kapazität auf n (oder höher) erhöht. In allen anderen Fällen verursacht der Funktionsaufruf keine Neuzuweisung und die Vektorkapazität ist nicht betroffen.

Diese Funktion hat keine Auswirkungen auf die Vektorgröße und kann ihre Elemente nicht ändern.

Ich bin nicht sicher, warum Sie etwas nach data() + size() nach reserve() in erster Linie für den Zugriff möchten: die beabsichtigte Verwendung von reserve() ist zu verhindern, dass unnötige Umschichtungen, wenn Sie wissen oder können die erwartete Größe des Containers schätzen, vermeiden Sie aber gleichzeitig die unnötige Initialisierung von Speicher, die entweder ineffizient oder unpraktisch ist (z. B. sind nicht-triviale Daten für die Initialisierung nicht verfügbar). In dieser Situation können Sie log(N) Neuzuweisungen und Kopien mit nur 1 Verbesserung der Leistung ersetzen.

Verwandte Themen