Heim >Backend-Entwicklung >C++ >„std::vector::reserve()' vs. „std::vector::resize()': Wann sollten Sie welche verwenden?
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.
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).
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.
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!