std::inplace_vector
| Definiert in Header <inplace_vector> |
||
| template< class T, |
(seit C++26) | |
inplace_vector ist ein dynamisch größenveränderbarer Vektor mit speziellem Speicherplatz im Objekt. Die Elemente vom Typ T werden innerhalb des Objekts selbst gespeichert und richtig ausgerichtet. Die Kapazität des internen Speichers ist zur Kompilierungszeit festgelegt und entspricht N.
Die Elemente werden zusammenhängend gespeichert, was bedeutet, dass Elemente nicht nur über Iteratoren oder zufälligen Zugriff mit operator[], sondern auch über Offsets zu regulären Zeigern auf Elemente zugegriffen werden können. Ein Zeiger auf ein Element eines inplace_vector kann an jede Funktion übergeben werden, die einen Zeiger auf ein Element eines C-Arrays erwartet.
Der inplace_vector modelliert Container, ReversibleContainer, ContiguousContainer und SequenceContainer, einschließlich der meisten optionalen Sequence-Container-Anforderungen, mit der Ausnahme, dass die Member-Funktionen push_front, emplace_front, pop_front und prepend_range nicht bereitgestellt werden.
Für jedes positive N erfüllen std::inplace_vector<T, N>::iterator und std::inplace_vector<T, N>::const_iterator die Anforderungen an ConstexprIterator.
Die Spezialisierung std::inplace_vector<T, 0> ist TriviallyCopyable und leer. std::is_trivially_default_constructible_v<std::inplace_vector<T, 0>> ist ebenfalls true.
Jede Member-Funktion von std::inplace_vector<T, N>, die eine Einfügung über die Kapazität N hinaus verursachen würde, wirft std::bad_alloc.
Die Komplexität gängiger Operationen auf inplace_vectors ist wie folgt:
- Zufallszugriff auf ein Element über
operator[]oderat()– konstant: 𝓞(1). - Einfügen oder Entfernen eines Elements am Ende – konstant: 𝓞(1).
- Einfügen oder Entfernen von Elementen am Ende – linear zur Anzahl der eingefügten/entfernten Elemente: 𝓞(n).
- Einfügen oder Entfernen von Elementen am Anfang oder in der Mitte – linear zur Anzahl der eingefügten/entfernten Elemente zuzüglich der Entfernung zum Ende des Vektors: 𝓞(n).
Inhalt |
[edit] Iterator-Invalidierung
Die Iterator-Invalidierungsgarantien von std::inplace_vector unterscheiden sich von denen von std::vector.
- Das Verschieben eines
inplace_vectors macht alle Iteratoren ungültig. - Das Vertauschen zweier
inplace_vectors macht alle Iteratoren ungültig (während des Vertauschens zeigt der Iterator weiterhin auf dasselbe Array-Element und kann somit seinen Wert ändern).
Die folgenden Member-Funktionen können Iteratoren ungültig machen: operator=, assign, assign_range, clear, emplace, erase, insert, insert_range, pop_back, resize und swap.
Die folgenden Member-Funktionen können nur den end-Iterator ungültig machen: append_range, emplace_back, push_back, try_append_range, try_emplace_back, try_push_back, unchecked_emplace_back und unchecked_push_back.
[edit] Template-Parameter
| T | - | Elementtyp. Muss MoveConstructible und MoveAssignable sein. |
| N | - | Kapazität, d.h. die maximale Anzahl von Elementen im inplace_vector (kann 0 sein). |
[edit] Member-Typen
| Typ | Definition |
value_type
|
T |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
Referenz
|
value_type& |
const_reference
|
const value_type& |
Zeiger
|
value_type* |
const_pointer
|
const value_type* |
iterator
|
Implementierungsdefinierter LegacyRandomAccessIterator und random_access_iterator zu value_type |
const_iterator
|
Implementierungsdefinierter LegacyRandomAccessIterator, ConstexprIterator(seit C++26) und random_access_iterator zu const value_type |
reverse_iterator
|
std::reverse_iterator<iterator> |
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[edit] Member-Funktionen
konstruiert den inplace_vector(public member function) | |
destruiert den inplace_vector(public member function) | |
| weist dem Container Werte zu (public member function) | |
| weist dem Container Werte zu (public member function) | |
| weist dem Container einen Bereich von Werten zu (public member function) | |
Elementzugriff | |
| Greift mit Überprüfung auf ein bestimmtes Element zu (public member function) | |
| Greift auf ein bestimmtes Element zu (public member function) | |
| Greift auf das erste Element zu (public member function) | |
| Greift auf das letzte Element zu (public member function) | |
| Direkter Zugriff auf den zugrundeliegenden zusammenhängenden Speicher (public member function) | |
Iteratoren | |
| gibt einen Iterator zum Anfang zurück (public member function) | |
| gibt einen Iterator zum Ende zurück (public member function) | |
| gibt einen Reverse-Iterator zum Anfang zurück (public member function) | |
| gibt einen Reverse-Iterator zum Ende zurück (public member function) | |
Größe und Kapazität | |
| prüft, ob der Container leer ist (public member function) | |
| Gibt die Anzahl der Elemente zurück (public member function) | |
| [static] |
Gibt die maximal mögliche Anzahl von Elementen zurück (public static member function) |
| [static] |
Gibt die Anzahl der Elemente zurück, die im derzeit zugewiesenen Speicher gehalten werden können (public static member function) |
| ändert die Anzahl der gespeicherten Elemente (public member function) | |
| [static] |
reserviert Speicher (public static member function) |
| [static] |
reduziert den Speicherverbrauch durch Freigabe von ungenutztem Speicher (public static member function) |
Modifizierer | |
| fügt Elemente ein (public member function) | |
| fügt einen Bereich von Elementen ein (public member function) | |
| konstruiert Elemente direkt (in-place) (public member function) | |
| konstruiert ein Element direkt (in-place) am Ende (public member function) | |
| versucht, ein Element inplace am Ende zu konstruieren (public member function) | |
| konstruiert bedingungslos ein Element inplace am Ende (public member function) | |
| fügt ein Element am Ende hinzu (public member function) | |
| versucht, ein Element am Ende hinzuzufügen (public member function) | |
| fügt bedingungslos ein Element am Ende hinzu (public member function) | |
| entfernt das letzte Element (public member function) | |
| fügt einen Bereich von Elementen am Ende hinzu (public member function) | |
| versucht, einen Bereich von Elementen am Ende hinzuzufügen (public member function) | |
| leert den Inhalt (public member function) | |
| entfernt Elemente (public member function) | |
| tauscht die Inhalte (public member function) | |
[edit] Nicht-Member-Funktionen
| spezialisiert den Algorithmus std::swap (function template) | |
| entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) | |
| (C++26) |
vergleicht die Werte von zwei inplace_vectors lexikographisch(function template) |
[edit] Anmerkungen
Die Anzahl der Elemente in einem inplace_vector kann dynamisch bis zu einer festen Kapazität variieren, da die Elemente innerhalb des Objekts selbst gespeichert werden, ähnlich wie bei std::array. Objekte werden jedoch beim Einfügen in inplace_vector initialisiert, im Gegensatz zu C-Arrays oder std::array, die alle Elemente bei der Instanziierung konstruieren müssen.
inplace_vector ist nützlich in Umgebungen, in denen dynamische Speicherzuweisungen unerwünscht sind.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_inplace_vector |
202406L |
(C++26) | std::inplace_vector: dynamisch größenveränderbarer Vektor mit festem Kapazitäts-Inplace-Speicher |
__cpp_lib_constexpr_inplace_vector |
202502L |
(C++26) | constexpr std::inplace_vector für nicht-triviale Elementtypen |
[edit] Beispiel
#include <algorithm> #include <array> #include <cassert> #include <inplace_vector> int main() { std::inplace_vector<int, 4> v1{0, 1, 2}; assert(v1.max_size() == 4); assert(v1.capacity() == 4); assert(v1.size() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1[0] == 0); assert(v1.at(0) == 0); assert(v1.front() == 0); assert(*v1.begin() == 0); assert(v1.back() == 2); v1.push_back(3); assert(v1.back() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2, 3})); v1.resize(3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1.try_push_back(3) != nullptr); assert(v1.back() == 3); assert(v1.size() == 4); assert(v1.try_push_back(13) == nullptr); // no place assert(v1.back() == 3); assert(v1.size() == 4); v1.clear(); assert(v1.size() == 0); assert(v1.empty()); }
[edit] Siehe auch
| reservierbares, zusammenhängendes Array (Klassenvorlage) | |
| (C++11) |
fest dimensioniertes, inplace, zusammenhängendes Array (Klassenvorlage) |
| Doppelt-endende Warteschlange (Klassenvorlage) |
[edit] Externe Links
| 1. | inplace_vector — Eine Referenzimplementierung von P0843R14 (std::inplace_vector). |
| 2. | static_vector — Boost.Container implementiert inplace vector als eigenständigen Typ mit eigenen Garantien. |
| 3. | fixed_vector — EASTL implementiert inplace vector über einen zusätzlichen Template-Parameter. |
| 4. | small_vector — Folly implementiert inplace vector ebenfalls über einen zusätzlichen Template-Parameter. |
| 5. | stack_alloc — Howard Hinnants benutzerdefinierte Allokatoren, die std::inplace_vector auf Basis von std::vector emulieren. |