Namespaces
Variants

std:: vector

From cppreference.net
Definiert im Header <vector>
template <

class T,
class Allocator = std:: allocator < T >

> class vector ;
(1)
namespace pmr {

template < class T >
using vector = std :: vector < T, std:: pmr :: polymorphic_allocator < T >> ;

}
(2) (seit C++17)
1) std::vector ist ein Sequenz-Container, der dynamische Arrays mit variabler Größe kapselt.
2) std::pmr::vector ist eine Alias-Vorlage, die einen polymorphic allocator verwendet.

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 std::vector -Objekte im Allgemeinen nicht constexpr sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.

(seit C++20)
  1. In libstdc++ ist shrink_to_fit() im C++98-Modus nicht verfügbar .

Inhaltsverzeichnis

Template-Parameter

T - Der Typ der Elemente.
T muss die Anforderungen von CopyAssignable und CopyConstructible erfüllen. (bis C++11)
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.

Feature-Test Makro Wert Std Feature
__cpp_lib_incomplete_container_elements 201505L (C++17) Minimale Unterstützung für unvollständige Typen
(seit C++17)

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

Allocator::pointer

(bis C++11)

std:: allocator_traits < Allocator > :: pointer

(seit C++11)
const_pointer

Allocator::const_pointer

(bis C++11)

std:: allocator_traits < Allocator > :: const_pointer

(seit C++11)
iterator

LegacyRandomAccessIterator und LegacyContiguousIterator zu value_type

(bis C++20)

LegacyRandomAccessIterator , contiguous_iterator , und ConstexprIterator zu value_type

(seit C++20)
const_iterator

LegacyRandomAccessIterator und LegacyContiguousIterator zu const value_type

(bis C++20)

LegacyRandomAccessIterator , contiguous_iterator , und ConstexprIterator zu const value_type

(seit C++20)
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)
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
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion)
(C++11)
gibt einen Iterator zum Ende zurück
(öffentliche Member-Funktion)
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)
reduziert Speicherverbrauch durch Freigabe ungenutzten Speichers
(öffentliche Elementfunktion)
Modifikatoren
löscht den Inhalt
(öffentliche Elementfunktion)
fügt Elemente ein
(öffentliche Elementfunktion)
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)
Konstruiert ein Element direkt am Ende
(öffentliche Elementfunktion)
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

Größenveränderbares, festkapazitives, inplace-kontinuierliches Array
(Klassentemplate)
(C++11)
Festgroßes inplace-kontinuierliches Array
(Klassentemplate)
Doppelseitige Warteschlange
(Klassentemplate)