Namespaces
Variants

std::vector<T,Allocator>:: resize

From cppreference.net

void resize ( size_type count ) ;
(1) (constexpr seit C++20)
void resize ( size_type count, const value_type & value ) ;
(2) (constexpr seit C++20)

Ändert die Größe des Containers, um count Elemente zu enthalten:

  • Wenn count gleich der aktuellen Größe ist, geschieht nichts.
  • Wenn die aktuelle Größe größer als count ist, wird der Container auf seine ersten count Elemente reduziert.
  • Wenn die aktuelle Größe kleiner als count ist, dann:
1) Zusätzliche Kopien von T ( ) (bis C++11) default-inserted Elemente (seit C++11) werden angehängt.
2) Zusätzliche Kopien von value werden angehängt.

Inhaltsverzeichnis

Parameter

count - neue Größe des Containers
value - der Wert, mit dem die neuen Elemente initialisiert werden
Typanforderungen
-

Wenn die folgende Bedingung erfüllt ist, ist das Verhalten undefiniert:

1) T ist nicht DefaultInsertable oder MoveInsertable in vector .
2) T ist nicht CopyInsertable in vector .
(seit C++11)

Komplexität

Linear in der Differenz zwischen der aktuellen Größe und count . Zusätzliche Komplexität möglich aufgrund von Neuzuweisung, wenn die Kapazität kleiner ist als count .

Ausnahmen

Wenn aus irgendeinem Grund eine Exception ausgelöst wird, haben diese Funktionen keine Wirkung ( strong exception safety guarantee ). Obwohl nicht explizit spezifiziert, wird std::length_error ausgelöst, wenn die Kapazität, die der neue vector benötigen würde, max_size() überschreiten würde.

In Überladung ( 1 ) , falls T 's Move-Konstruktor nicht noexcept ist und T nicht CopyInsertable in * this ist, wird vector den werfenden Move-Konstruktor verwenden. Falls dieser wirft, ist die Garantie aufgehoben und die Effekte sind nicht spezifiziert.

(since C++11)

Hinweise

Wenn die Wertinitialisierung in Überladung ( 1 ) unerwünscht ist, zum Beispiel wenn die Elemente von Nicht-Klassen-Typ sind und das Nullsetzen nicht benötigt wird, kann dies vermieden werden, indem ein benutzerdefinierter Allocator::construct bereitgestellt wird.
Die Vektorkapazität wird bei der Verkleinerung niemals reduziert, da dies alle Iteratoren ungültig machen würde, während die Spezifikation nur die Iteratoren zu/nach den gelöschten Elementen ungültig macht.

Beispiel

#include <vector>
#include <iostream>
void print(auto rem, const std::vector<int>& c)
{
    for (std::cout << rem; const int el : c)
        std::cout << el << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<int> c = {1, 2, 3};
    print("The vector holds: ", c);
    c.resize(5);
    print("After resize up to 5: ", c);
    c.resize(2);
    print("After resize down to 2: ", c);
    c.resize(6, 4);
    print("After resize up to 6 (initializer = 4): ", c);
}

Ausgabe:

The vector holds: 1 2 3
After resize up to 5: 1 2 3 0 0
After resize down to 2: 1 2
After resize up to 6 (initializer = 4): 1 2 4 4 4 4
**Übersetzungserläuterungen:** - "Run this code" → "Diesen Code ausführen" (professionelle Übersetzung für Code-Ausführung) - "Output:" → "Ausgabe:" (Standardübersetzung im Programmierkontext) - HTML-Tags, Attribute und Code innerhalb von `
`-Tags wurden unverändert belassen
- C++-spezifische Begriffe wie "vector", "resize", "initializer" wurden nicht übersetzt
- Die Formatierung und Struktur der Webseite wurde vollständig beibehalten

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 679 C++98 resize() übergab value als Wert übergibt als const-Referenz
LWG 1525 C++98 das Verhalten von resize ( size ( ) ) war nicht spezifiziert spezifiziert
LWG 2033 C++11 1. Elemente wurden durch erase() entfernt [1]
2. die Typanforderungen von T waren inkorrekt
1. verwendet pop_back()
2. korrigiert
LWG 2066 C++11 Überladung ( 1 ) hatte keine Exception-Sicherheitsgarantie
wie Überladung ( 2 )
hinzugefügt
LWG 2160 C++11 Elemente wurden durch pop_back() entfernt [2]
aufgrund der Lösung von LWG 2033
spezifiziert die Methode der
Elemententfernung nicht
  1. erase() kann Elemente in der Mitte eines vector entfernen, daher muss der Werttyp MoveAssignable sein, damit die nachfolgenden Elemente nach vorne verschoben werden können, um die Lücke zu füllen. Allerdings kann resize() nur Elemente am Ende des vector entfernen, wodurch MoveAssignable unnötig wird.
  2. Das Entfernen von Elementen mittels pop_back() impliziert, dass die Elemente von hinten nach vorne entfernt werden müssen.

Siehe auch

gibt die maximal mögliche Anzahl von Elementen zurück
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück, die im aktuell allozierten Speicher gehalten werden können
(öffentliche Elementfunktion)
prüft, ob der Container leer ist
(öffentliche Elementfunktion)