std:: vector
|
Definiert im Header
<vector>
|
||
|
template
<
class
T,
|
(1) | |
|
namespace
pmr
{
template
<
class
T
>
|
(2) | (seit C++17) |
std::vector
ist ein Sequenz-Container, der dynamische Arrays mit variabler Größe kapselt.
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) .
std::vector
(für
T
außer
bool
) erfüllt die Anforderungen von
Container
,
AllocatorAwareContainer
(seit C++11)
,
SequenceContainer
,
ContiguousContainer
(seit C++17)
und
ReversibleContainer
.
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
|
(seit C++20) |
-
↑
In libstdc++ ist
shrink_to_fit()im C++98-Modus nicht verfügbar .
Inhaltsverzeichnis |
Template-Parameter
| T | - |
Der Typ der Elemente.
|
||||||||||||||
| Allokator | - |
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.
|
platzsparende dynamische Bitset
(Klassen-Templatespezialisierung) |
Iterator-Invalidierung
| Operationen | Ungültig gemacht |
|---|---|
| Alle schreibgeschützten Operationen | Niemals. |
| swap , std::swap | end() |
| clear , operator= , assign | Immer. |
| reserve , shrink_to_fit | Falls der Vektor die Kapazität geändert hat, alle. Falls nicht, keine. |
| erase | Gelöschte Elemente und alle Elemente nach ihnen (einschließlich end() ). |
| push_back , emplace_back | Falls der Vektor die Kapazität geändert hat, alle. Falls nicht, nur end() . |
| insert , emplace |
Falls der Vektor die Kapazität geändert hat, alle.
Falls nicht, nur die am oder nach dem Einfügepunkt (einschließlich end() ). |
| resize | Falls der Vektor die Kapazität geändert hat, alle. Falls nicht, nur end() und alle gelöschten Elemente. |
| pop_back | Das gelöschte Element und end() . |
Mitgliedertypen
| Mitgliedertyp | Definition | ||||
value_type
|
T
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
Vorzeichenloser Ganzzahltyp (üblicherweise std::size_t ) | ||||
difference_type
|
Vorzeichenbehafteter Ganzzahltyp (üblicherweise std::ptrdiff_t ) | ||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Memberfunktionen
konstruiert den
vector
(öffentliche Elementfunktion) |
|
zerstört den
vector
(öffentliche Elementfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
(C++23)
|
weist dem Container einen Wertebereich zu
(öffentliche Elementfunktion) |
|
gibt den zugeordneten Allokator zurück
(öffentliche Elementfunktion) |
|
Elementzugriff |
|
|
Zugriff auf bestimmtes Element mit Grenzprüfung
(öffentliche Elementfunktion) |
|
|
Zugriff auf spezifisches Element
(öffentliche Member-Funktion) |
|
|
Zugriff auf das erste Element
(öffentliche Elementfunktion) |
|
|
greift auf das letzte Element zu
(öffentliche Elementfunktion) |
|
|
Direktzugriff auf den zugrundeliegenden zusammenhängenden Speicher
(öffentliche Elementfunktion) |
|
Iteratoren |
|
|
(C++11)
|
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion) |
|
(C++11)
|
gibt einen Iterator zum Ende zurück
(öffentliche Member-Funktion) |
|
(C++11)
|
gibt einen Reverse-Iterator zum Anfang zurück
(öffentliche Member-Funktion) |
|
(C++11)
|
gibt einen Reverse Iterator zum Ende zurück
(öffentliche Member-Funktion) |
Kapazität |
|
|
prüft, ob der Container leer ist
(öffentliche Elementfunktion) |
|
|
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion) |
|
|
gibt die maximal mögliche Anzahl von Elementen zurück
(öffentliche Elementfunktion) |
|
|
Speicher reservieren
(öffentliche Elementfunktion) |
|
|
gibt die Anzahl der Elemente zurück, die im aktuell allozierten Speicherplatz gehalten werden können
(öffentliche Elementfunktion) |
|
|
(
DR*
)
|
reduziert Speicherverbrauch durch Freigabe ungenutzten Speichers
(öffentliche Elementfunktion) |
Modifikatoren |
|
|
löscht den Inhalt
(öffentliche Elementfunktion) |
|
|
fügt Elemente ein
(öffentliche Elementfunktion) |
|
|
(C++23)
|
fügt eine Reihe von Elementen ein
(öffentliche Elementfunktion) |
|
(C++11)
|
Konstruiert Element direkt an Ort und Stelle
(öffentliche Elementfunktion) |
|
löscht Elemente
(öffentliche Elementfunktion) |
|
|
fügt ein Element am Ende hinzu
(öffentliche Elementfunktion) |
|
|
(C++11)
|
Konstruiert ein Element direkt am Ende
(öffentliche Elementfunktion) |
|
(C++23)
|
fügt eine Reihe von Elementen am Ende hinzu
(öffentliche Elementfunktion) |
|
entfernt das letzte Element
(öffentliche Elementfunktion) |
|
|
ändert die Anzahl der gespeicherten Elemente
(öffentliche Elementfunktion) |
|
|
tauscht die Inhalte aus
(öffentliche Elementfunktion) |
|
Nicht-Member-Funktionen
|
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(C++20)
|
vergleicht lexikographisch die Werte von zwei
vector
s
(Funktions-Template) |
|
spezialisiert den
std::swap
Algorithmus
(Funktions-Template) |
|
|
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template) |
Deduktionsleitfäden |
(seit C++17) |
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Ranges-Konstruktion und -Einfügung für Container |
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) |
ranges::approximately_sized_range
,
ranges::reserve_hint
und Änderungen an
std::vector
|
Beispiel
#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 aus for (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.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 69 | C++98 |
Kontiguität des Speichers für Elemente von
vector
war nicht erforderlich
|
erforderlich |
| LWG 230 | C++98 |
T
musste nicht
CopyConstructible
sein
(ein Element vom Typ
T
konnte möglicherweise nicht konstruiert werden)
|
T
muss ebenfalls
CopyConstructible sein |
| LWG 464 | C++98 |
Zugriff auf den zugrundeliegenden Speicher eines leeren
vector
führte zu UB
|
data
Funktion bereitgestellt
|
Siehe auch
|
(C++26)
|
Größenveränderbares, festkapazitives, inplace-kontinuierliches Array
(Klassentemplate) |
|
(C++11)
|
Festgroßes inplace-kontinuierliches Array
(Klassentemplate) |
|
Doppelseitige Warteschlange
(Klassentemplate) |