std::inplace_vector
| Definiert in Header <inplace_vector>
|
||
template<
class T,
std::size_t N
> struct inplace_vector;
|
(seit C++26) | |
std::inplace_vector ist ein dynamisch in der Größe verä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 Compilezeit festgelegt und entspricht N.
Die Elemente werden zusammenhängend gespeichert, was bedeutet, dass auf Elemente nicht nur über Iteratoren oder wahlfreien Zugriff operator[] zugegriffen werden kann, sondern auch über Offsets auf reguläre Zeiger 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.
std::inplace_vector erfüllt die Anforderungen von Container, ReversibleContainer, ContiguousContainer und SequenceContainer, einschließlich der meisten optionalen sequentiellen Containeranforderungen, mit der Ausnahme, dass die Memberfunktionen push_front, emplace_front, pop_front und prepend_range nicht bereitgestellt werden.
Für jedes N erfüllen std::inplace_vector<T, N>::iterator und std::inplace_vector<T, N>::const_iterator die Anforderungen von 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 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 üblicher Operationen auf inplace_vectors ist wie folgt:
- Wahlfreier Zugriff 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 dem Abstand zum Ende des Vektors: 𝓞(n).
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).
|
Mitgliedstypen
| 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
|
implementierungsabhängig LegacyRandomAccessIterator und random_access_iterator zu value_type
|
const_iterator
|
implementierungsabhängig LegacyRandomAccessIterator, ConstexprIterator 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) |
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. Allerdings werden Objekte initialisiert, wenn sie in inplace_vector eingefügt werden, im Gegensatz zu C-Arrays oder std::array, die bei der Instanziierung alle Elemente konstruieren müssen.
inplace_vector ist in Umgebungen nützlich, in denen dynamische Speicherzuweisungen unerwünscht sind.
| Feature-Test-Makro | Wert | Std | Merkmal |
|---|---|---|---|
__cpp_lib_inplace_vector |
202406L |
(C++26) | std::inplace_vector: dynamisch vergrößerbarer Vektor mit fester Kapazität und In-Place-Speicher
|
202603L |
(C++26) | Besserer Rückgabetyp für try_push_back() und try_emplace_back(). Entfernt try_append_range()
| |
__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>
#include <optional>
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) != std::nullopt);
assert(v1.back() == 3);
assert(v1.size() == 4);
assert(v1.try_push_back(13) == std::nullopt); // no place
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.
|