std:: inplace_vector
|
Definiert in Header
<inplace_vector>
|
||
|
template
<
class
T,
|
(seit C++26) | |
inplace_vector
ist ein dynamisch größenveränderbares Array mit zusammenhängendem Inplace-Speicher. Die Elemente vom Typ
T
werden innerhalb des Objekts selbst gespeichert und korrekt ausgerichtet. Die Kapazität des internen Speichers ist zur Kompilierzeit festgelegt und entspricht
N
.
Die Elemente werden zusammenhängend gespeichert, was bedeutet, dass auf Elemente nicht nur über Iteratoren oder den wahlfreien Zugriff
operator
[
]
zugegriffen werden kann, sondern auch über Offsets zu regulären Zeigern auf Elemente. Ein Zeiger auf ein Element eines
inplace_vector
kann an jede Funktion übergeben werden, die einen Zeiger auf ein Element eines C-Arrays erwartet.
Das
inplace_vector
modelliert
Container
,
ReversibleContainer
,
ContiguousContainer
und
SequenceContainer
, einschließlich der meisten
optionalen Sequence-Container-Anforderungen
, mit Ausnahme der Member-Funktionen
push_front
,
emplace_front
,
pop_front
und
prepend_range
, die nicht bereitgestellt werden.
Für jede positive
N
erfüllen
std::inplace_vector<T, N>::iterator
und
std::inplace_vector<T, N>::const_iterator
die
ConstexprIterator
-Anforderungen.
Die Spezialisierung std :: inplace_vector < T, 0 > ist TriviallyCopyable und ist leer. std:: is_trivially_default_constructible_v < std :: inplace_vector < T, 0 >> ist ebenfalls true .
Jede Memberfunktion 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_vector
s ist wie folgt:
-
Direktzugriff 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 in der Anzahl der eingefügten/entfernten Elemente: 𝓞(n) .
- Einfügen oder Entfernen von Elementen am Anfang oder in der Mitte – linear in der Anzahl der eingefügten/entfernten Elemente plus der Entfernung zum Ende des Vektors: 𝓞(n) .
Inhaltsverzeichnis |
Iterator-Invalidierung
std::inplace_vector
Iterator-Invalidierungsgarantien unterscheiden sich von
std::vector
:
-
Das Verschieben eines
inplace_vectormacht alle Iteratoren ungültig; -
Das Austauschen zweier
inplace_vectors macht alle Iteratoren ungültig (während des Austauschs zeigt der Iterator weiterhin auf dasselbe Array-Element und kann somit seinen Wert ändern).
Die folgenden Memberfunktionen können möglicherweise Iteratoren ungültig machen:
operator=
,
assign
,
assign_range
,
clear
,
emplace
,
erase
,
insert
,
insert_range
,
pop_back
,
resize
, und
swap
.
Die folgenden Memberfunktionen machen potenziell nur den
end
-Iterator ungültig:
append_range
,
emplace_back
,
push_back
,
try_append_range
,
try_emplace_back
,
try_push_back
,
unchecked_emplace_back
, und
unchecked_push_back
.
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).
|
Mitgliedertypen
| Typ | Definition |
value_type
|
T
|
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
reference
|
value_type & |
const_reference
|
const value_type & |
pointer
|
value_type * |
const_pointer
|
const value_type * |
iterator
|
implementierungsdefiniert
LegacyRandomAccessIterator
und
random_access_iterator
zu
value_type
|
const_iterator
|
implementierungsdefiniert
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 > |
Memberfunktionen
konstruiert den
inplace_vector
(öffentliche Elementfunktion) |
|
zerstört den
inplace_vector
(öffentliche Mitgliedsfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
weist dem Container einen Wertebereich zu
(öffentliche Elementfunktion) |
|
Elementzugriff |
|
|
Zugriff auf bestimmtes Element mit Grenzprüfung
(öffentliche Elementfunktion) |
|
|
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion) |
|
|
greift auf das erste Element zu
(öffentliche Elementfunktion) |
|
|
Zugriff auf das letzte Element
(öffentliche Member-Funktion) |
|
|
direkter Zugriff auf den zugrundeliegenden zusammenhängenden Speicher
(öffentliche Elementfunktion) |
|
Iteratoren |
|
|
gibt einen Iterator zum Anfang zurück
(public member function) |
|
|
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion) |
|
|
gibt einen Reverse-Iterator zum Anfang zurück
(öffentliche Member-Funktion) |
|
|
gibt einen Reverse-Iterator zum Ende zurück
(öffentliche Member-Funktion) |
|
Größe und Kapazität |
|
|
prüft, ob der Container leer ist
(öffentliche Elementfunktion) |
|
|
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion) |
|
|
[static]
|
gibt die maximal mögliche Anzahl von Elementen zurück
(öffentliche statische Elementfunktion) |
|
[static]
|
gibt die Anzahl der Elemente zurück, die im aktuell allozierten Speicherplatz gehalten werden können
(öffentliche statische Elementfunktion) |
|
ändert die Anzahl der gespeicherten Elemente
(öffentliche Elementfunktion) |
|
|
[static]
|
reserviert Speicher
(öffentliche statische Member-Funktion) |
|
[static]
|
reduziert Speichernutzung durch Freigabe ungenutzten Speichers
(öffentliche statische Member-Funktion) |
Modifikatoren |
|
|
fügt Elemente ein
(öffentliche Elementfunktion) |
|
|
fügt eine Reihe von Elementen ein
(öffentliche Elementfunktion) |
|
|
Konstruiert Element direkt vor Ort
(öffentliche Elementfunktion) |
|
|
Konstruiert ein Element direkt am Ende
(öffentliche Elementfunktion) |
|
|
versucht, ein Element direkt am Ende zu konstruieren
(öffentliche Elementfunktion) |
|
|
konstruiert bedingungslos ein Element direkt am Ende
(öffentliche Elementfunktion) |
|
|
fügt ein Element am Ende hinzu
(öffentliche Elementfunktion) |
|
|
versucht, ein Element am Ende hinzuzufügen
(öffentliche Elementfunktion) |
|
|
fügt bedingungslos ein Element am Ende hinzu
(öffentliche Elementfunktion) |
|
|
entfernt das letzte Element
(öffentliche Elementfunktion) |
|
|
fügt eine Reihe von Elementen am Ende hinzu
(öffentliche Elementfunktion) |
|
|
versucht, einen Bereich von Elementen am Ende hinzuzufügen
(öffentliche Elementfunktion) |
|
|
löscht den Inhalt
(öffentliche Elementfunktion) |
|
|
löscht Elemente
(öffentliche Elementfunktion) |
|
|
tauscht die Inhalte aus
(öffentliche Elementfunktion) |
|
Nicht-Member-Funktionen
|
(C++26)
|
spezialisiert den
std::swap
Algorithmus
(Funktions-Template) |
|
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template) |
|
|
(C++26)
|
vergleicht die Werte zweier
inplace_vector
s lexikographisch
(Funktions-Template) |
Hinweise
Die Anzahl der Elemente in einem
inplace_vector
kann dynamisch bis zu einer festen Kapazität variieren, da Elemente ähnlich wie bei
std::array
innerhalb des Objekts selbst gespeichert werden. Allerdings werden Objekte initialisiert, wenn sie in den
inplace_vector
eingefügt werden, anders als bei C-Arrays oder
std::array
, die alle Elemente bei der Instanziierung konstruieren müssen.
inplace_vector
ist nützlich in Umgebungen, in denen dynamische Speicherallokationen unerwünscht sind.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_inplace_vector
|
202406L
|
(C++26) |
std::inplace_vector
: dynamisch veränderbarer Vektor mit fester Kapazität im Inplace-Speicher
|
__cpp_lib_constexpr_inplace_vector
|
202502L
|
(C++26) |
constexpr
std::inplace_vector
für nicht-triviale Elementtypen
|
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); // kein Platz assert(v1.back() == 3); assert(v1.size() == 4); v1.clear(); assert(v1.size() == 0); assert(v1.empty()); }
Siehe auch
|
Größenveränderbares zusammenhängendes Array
(Klassen-Template) |
|
|
(C++11)
|
Festgroßes Inplace-zusammenhängendes Array
(Klassen-Template) |
|
Doppelseitige Warteschlange
(Klassen-Template) |
Externe Links
| 1. |
inplace_vector
— Eine Referenzimplementierung von
P0843R14
(
std::inplace_vector
).
|
| 2. |
static_vector
— Boost.Container implementiert Inplace-Vektor als eigenständigen Typ mit eigenen Garantien.
|
| 3. |
fixed_vector
— EASTL implementiert Inplace-Vektor über einen zusätzlichen Template-Parameter.
|
| 4. |
small_vector
— Folly implementiert Inplace-Vektor ebenfalls über einen zusätzlichen Template-Parameter.
|
| 5. |
stack_alloc
— Howard Hinnants benutzerdefinierte Allokatoren, die
std::inplace_vector
auf Basis von
std::vector
emulieren.
|