Namespaces
Variants

std:: inplace_vector

From cppreference.net
Definiert in Header <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(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[] 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 der Entfernung zum Ende des Vektors: 𝓞(n) .

Inhaltsverzeichnis

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).

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)
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)

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.