Mit Ausnahme der
std::vector<bool>
-Teilspezialisierung werden die Elemente zusammenhängend gespeichert, was bedeutet, dass auf Elemente nicht nur über Iteratoren zugegriffen werden kann, sondern auch mittels Offsets zu regulären Zeigern auf Elemente. Dies bedeutet, dass ein Zeiger auf ein Element eines Vektors an jede Funktion übergeben werden kann, die einen Zeiger auf ein Element eines Arrays erwartet.
Die Speicherung des Vectors wird automatisch verwaltet und bei Bedarf erweitert. Vectors belegen in der Regel mehr Speicherplatz als statische Arrays, da mehr Speicher für zukünftiges Wachstum reserviert wird. Auf diese Weise muss ein Vector nicht bei jedem Einfügen eines Elements neu allokieren, sondern nur wenn der zusätzliche Speicher erschöpft ist. Die gesamte Menge des allokierten Speichers kann mit der
capacity()
Funktion abgefragt werden. Zusätzlicher Speicher kann dem System durch einen Aufruf von
shrink_to_fit()
[1]
zurückgegeben werden.
Neuzuordnungen sind in der Regel kostspielige Operationen in Bezug auf die Leistung. Die
reserve()
Funktion kann verwendet werden, um Neuzuordnungen zu vermeiden, wenn die Anzahl der Elemente im Voraus bekannt ist.
Die Komplexität (Effizienz) gängiger Operationen auf Vektoren ist wie folgt:
Direktzugriff - konstant
𝓞(1)
.
Einfügen oder Entfernen von Elementen am Ende - amortisiert konstant
𝓞(1)
.
Einfügen oder Entfernen von Elementen - linear in der Entfernung zum Ende des Vektors
𝓞(n)
.
Alle Memberfunktionen von
std::vector
sind
constexpr
: Es ist möglich,
std::vector
-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.
Allerdings können
std::vector
-Objekte im Allgemeinen nicht
constexpr
sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.
Die Anforderungen an die Elemente hängen von den tatsächlich durchgeführten Operationen auf dem Container ab. Allgemein wird gefordert, dass der Elementtyp ein vollständiger Typ ist und die Anforderungen von
Erasable
erfüllt, aber viele Memberfunktionen stellen strengere Anforderungen.
(seit C++11)
(bis C++17)
Die Anforderungen an die Elemente hängen von den tatsächlich durchgeführten Operationen auf dem Container ab. Allgemein wird gefordert, dass der Elementtyp die Anforderungen von
Erasable
erfüllt, aber viele Memberfunktionen stellen strengere Anforderungen. Dieser Container (aber nicht seine Member) kann mit einem unvollständigen Elementtyp instanziiert werden, wenn der Allokator die
Allokator-Vollständigkeitsanforderungen
erfüllt.
Ein Allokator, der zum Anfordern/Freigeben von Speicher und zum Konstruieren/Destruieren der Elemente in diesem Speicher verwendet wird. Der Typ muss die Anforderungen von
Allocator
erfüllen.
Das Verhalten ist undefiniert
(bis C++20)
Das Programm ist fehlerhaft
(seit C++20)
wenn
Allocator::value_type
nicht identisch mit
T
ist.
Spezialisierungen
Die Standardbibliothek bietet eine Spezialisierung von
std::vector
für den Typ
bool
an, die bezüglich Speichereffizienz optimiert sein kann.
ranges::approximately_sized_range
,
ranges::reserve_hint
und Änderungen an
std::vector
Beispiel
Diesen Code ausführen
#include <iostream>#include <vector>int main(){// Erstelle einen Vektor mit Ganzzahlen
std::vector<int> v ={8, 4, 5, 9};// Füge zwei weitere Ganzzahlen zum Vektor hinzu
v.push_back(6);
v.push_back(9);// Überschreibe Element an Position 2
v[2]=-1;// Gib den Vektor ausfor(int n : v)std::cout<< n <<' ';std::cout<<'\n';}
Ausgabe:
8 4 -1 9 6 9
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.