Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | container‎ | vector
 
 
 
 
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 auf count Elemente; tut nichts, wenn count == size().

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) Werden zusätzliche standardmäßig eingefügte Elemente angehängt.
2) Werden zusätzliche Kopien von value angehängt.

Inhalt

[editieren] Parameter

zählt - neue Größe des Containers
value - der Wert, mit dem die neuen Elemente initialisiert werden sollen
Typanforderungen
-
T muss die Anforderungen von MoveInsertable und DefaultInsertable erfüllen, um Überladung (1) verwenden zu können.
-
T muss die Anforderungen von CopyInsertable erfüllen, um Überladung (2) verwenden zu können.

[editieren] Komplexität

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

Ausnahmen

Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, haben diese Funktionen keine Auswirkungen (starke Ausnahme-Sicherheitsgarantie). Obwohl nicht explizit angegeben, wird std::length_error ausgelöst, wenn die von dem neuen vector benötigte Kapazität die von max_size() benötigte übersteigen würde.

In Überladung (1), wenn der Move-Konstruktor von T nicht noexcept ist und T nicht CopyInsertable in *this ist, verwendet der Vektor den werfenden Move-Konstruktor. Wenn dieser eine Ausnahme wirft, ist die Garantie aufgehoben und die Auswirkungen sind undefiniert.

(seit C++11)

Anmerkungen

Wenn die Wertinitialisierung in Überladung (1) unerwünscht ist, zum Beispiel, wenn die Elemente von einem nicht-Klassen-Typ sind und kein Nullsetzen benötigt wird, kann dies durch die Bereitstellung eines benutzerdefinierten Allocator::construct vermieden werden.
Die Kapazität des Vektors wird beim Verkleinern nie 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.

[editieren] 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

Defect reports

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 679 C++98 resize() übergab value per Wert übergibt per const-Referenz
LWG 1525 C++98 das Verhalten von resize(size()) war nicht spezifiziert spezifiziert
LWG 2033 C++11 1. Elemente wurden mittels erase() entfernt[1]
2. Die Typanforderungen von T waren inkorrekt
1. Verwendet pop_back()
2. Korrigiert
LWG 2066 C++11 Überladung (1) hatte nicht die Ausnahme
Sicherheitsgarantie von Überladung (2)
hinzugefügt
LWG 2160 C++11 Elemente wurden mittels pop_back() entfernt[2]
aufgrund der Auflösung von LWG 2033
spezifiziert nicht die Methode
des Entfernens von Elementen
  1. erase() kann Elemente mitten in einem vector entfernen, daher muss der Werttyp MoveAssignable sein, damit die Elemente hinter dem entfernten Abschnitt nach vorne verschoben werden können, um die Lücke zu füllen. Allerdings kann resize() nur Elemente am Ende des vector entfernen, wodurch das MoveAssignable unnötig wird.
  2. Das Entfernen von Elementen mittels pop_back() impliziert, dass die Elemente von hinten nach vorne entfernt werden müssen.

[editieren] Siehe auch

Gibt die maximal mögliche Anzahl von Elementen zurück
(public member function) [edit]
Gibt die Anzahl der Elemente zurück
(public member function) [edit]
Gibt die Anzahl der Elemente zurück, die im derzeit zugewiesenen Speicher gehalten werden können
(public member function) [edit]
prüft, ob der Container leer ist
(public member function) [edit]