Heim >Backend-Entwicklung >C++ >„std::vector::reserve()' vs. „std::vector::resize()': Wann sollten Sie welche verwenden?

„std::vector::reserve()' vs. „std::vector::resize()': Wann sollten Sie welche verwenden?

Susan Sarandon
Susan SarandonOriginal
2024-12-25 01:03:10622Durchsuche

`std::vector::reserve()` vs. `std::vector::resize()`: When Should You Use Which?

std::vector::reserve() vs. std::vector::resize()

In einer aktuellen Diskussion wurde das Thema der Verwendung von std:: vector::reserve() vs. std::vector::resize() entstanden. In diesem Beitrag werden wir uns mit den Unterschieden zwischen diesen beiden Methoden befassen.

Um den Kontext bereitzustellen, betrachten wir einen Beispielcodeausschnitt:

void MyClass::my_method() {
    my_member.reserve(n_dim);
    for (int k = 0; k < n_dim; k++) my_member[k] = k;
}

In diesem Code ist die Absicht, Folgendes zu tun Erstellen Sie einen Vektor mit einer angegebenen Kapazität (n_dim) und durchlaufen Sie dann den Vektor, greifen Sie auf seine Elemente zu und ändern Sie sie. Es stellt sich jedoch die Frage, ob die Verwendung von „reserve()“ für diesen Zweck geeignet ist.

Den Unterschied verstehen

std::vector::reserve() ist darauf ausgelegt, Speicher im Vektor zu reservieren, um ihn unterzubringen eine bestimmte Anzahl von Elementen. Die Größe des Vektors wird jedoch nicht wirklich geändert. Die logische Größe des Vektors bleibt gleich, was bedeutet, dass das Verhalten undefiniert ist, wenn Sie versuchen, auf Elemente zuzugreifen, die die aktuelle logische Größe überschreiten.

Andererseits ist std::vector::resize() beides Reserviert Speicher und ändert die Größe des Vektors. Es setzt die logische Größe des Vektors auf den angegebenen Wert. Alle zusätzlichen Elemente, die als Ergebnis der Größenänderung erstellt werden, werden auf ihre Standardwerte initialisiert (z. B. 0 für Ints).

Anwendung auf den Beispielcode

Im dargestellten Beispielcode wird mit std ::vector::reserve() anstelle von std::vector::resize() kann zu undefiniertem Verhalten führen. Der Code geht davon aus, dass der Vektor nach dem Aufruf von Reserve() eine Größe von n_dim hat, dies ist jedoch nicht der Fall. Daher führt der Zugriff auf my_member[k] mit k größer oder gleich der ursprünglichen Größe des Vektors zu einer Speicherzugriffsverletzung oder einem anderen undefinierten Verhalten.

Schlussfolgerung

Abschließend: richtig Um auf Elemente in einem Vektor zuzugreifen und diese zu ändern, ist es wichtig, den Unterschied zwischen std::vector::reserve() und std::vector::resize() zu verstehen. Reserve() wird verwendet, um Speicher ohne Größenänderung zuzuweisen, während resize() sowohl die Speicherzuweisung als auch die Größe des Vektors ändert und alle neu erstellten Elemente initialisiert. Im bereitgestellten Beispielcode sollte std::vector::resize() verwendet werden, um Speicher zuzuweisen und die Größe des Vektors festzulegen, um den ordnungsgemäßen Zugriff und die Änderung seiner Elemente zu ermöglichen.

Das obige ist der detaillierte Inhalt von„std::vector::reserve()' vs. „std::vector::resize()': Wann sollten Sie welche verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn