Heim >Backend-Entwicklung >C++ >std::vector::reserve() vs. std::vector::resize(): Wann sollte ich welche verwenden?

std::vector::reserve() vs. std::vector::resize(): Wann sollte ich welche verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-29 13:04:22320Durchsuche

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

Den Unterschied verstehen: std::vector::resize() vs. std::vector::reserve()

Das Thema von std::vector::reserve() vs. std::vector::resize() hat in der Programmiergemeinschaft Diskussionen ausgelöst. Ziel dieses Artikels ist es, ihre unterschiedlichen Rollen bei der Vektormanipulation zu klären.

std::vector::reserve()

std::vector::reserve() reserviert Speicher für die angegebene Anzahl von Elementen, ändert jedoch nicht die Größe des Vektors selbst. Der Vektor behält seine ursprüngliche logische Größe. Diese Methode ist nützlich, wenn Sie dem Vektor Elemente hinzufügen möchten und die Leistung durch Vorabzuweisung von Speicher optimieren möchten.

std::vector::resize()

std: :vector::resize() ändert die Größe des Vektors auf die angegebene Anzahl von Elementen. Wenn der Vektor erweitert werden muss, wird zusätzlicher Speicher zugewiesen. Im Gegensatz zu „reserve()“ initialisiert resize() alle neuen Elemente auf ihre Standardwerte.

Beispielverwendung

Beachten Sie den in der Frage bereitgestellten Code:

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

Der Antwort zufolge ist die Verwendung von „reserve()“ hier falsch. Um Elemente korrekt in den Vektor zu schreiben, sollte man resize() verwenden:

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

Visual Studio 2010 SP1-Verhalten

Das erwähnte „Absturz“-Verhalten des Codes in Visual Studio 2010 SP1 stimmt mit dem in der Antwort beschriebenen korrekten Verhalten überein. Der Versuch, auf ein Element zuzugreifen, das über die logische Größe des Vektors hinausgeht (in diesem Fall my_member[5]), bevor die Größe des Vektors geändert wird, führt zu undefiniertem Verhalten.

Reservierung und Ungültigkeitserklärung

Es ist wichtig zu beachten, dass die Verwendung von „reserve()“ und das anschließende Hinzufügen von Elementen über „push_back()“ Referenzen, Iteratoren oder Zeiger auf Daten in der ungültig machen kann Vektor. Dies liegt daran, dass Reserve() Speicher zuweist, ohne die Größe zu ändern, und wenn neue Elemente hinzugefügt werden, können diese an einer anderen Stelle platziert werden.

Zusammenfassend: std::vector::reserve() und std::vector ::resize() haben unterschiedliche Zwecke. Reserve() weist Speicher vorab zu, während resize() die Größe des Vektors ändert und neue Elemente initialisiert. Das Verständnis ihrer Unterschiede ist für eine effiziente Vektormanipulation von entscheidender Bedeutung.

Das obige ist der detaillierte Inhalt vonstd::vector::reserve() vs. std::vector::resize(): Wann sollte ich 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