Namespaces
Variants

std::inplace_vector

Von de.cppreference.net
 
 
 
 
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[] oder at() – 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_vector macht alle Iteratoren ungültig;
  • Das Austauschen zweier inplace_vector s 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)
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

spezialisiert den std::swap Algorithmus
(Funktions-Template)
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template)
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.