Namespaces
Variants

C++ named requirements: AllocatorAwareContainer (since C++11)

From cppreference.net
C++ named requirements

Ein AllocatorAwareContainer ist ein Container , der eine Instanz eines Allocator enthält und diese Instanz in allen seinen Memberfunktionen verwendet, um Speicher zu allozieren und freizugeben sowie Objekte in diesem Speicher zu konstruieren und zu zerstören (solche Objekte können Containerelemente, Knoten oder bei ungeordneten Containern Bucket-Arrays sein) , mit der Ausnahme, dass std::basic_string -Spezialisierungen die Allokatoren nicht für die Konstruktion/Destruktion ihrer Elemente verwenden (seit C++23) .

Die folgenden Regeln gelten für die Container-Konstruktion:

  • Kopierkonstruktoren von AllocatorAwareContainer s erhalten ihre Instanzen des Allokators durch Aufruf von std:: allocator_traits < allocator_type > :: select_on_container_copy_construction auf dem Allokator des zu kopierenden Containers.
  • Move-Konstruktoren erhalten ihre Instanzen von Allokatoren durch Move-Konstruktion vom Allokator des alten Containers.
  • Alle anderen Konstruktoren nehmen einen const allocator_type & Parameter.

Die einzige Möglichkeit, einen Allocator zu ersetzen, ist Copy-Zuweisung, Move-Zuweisung und Swap:

  • Copy-Zuweisung ersetzt den Allokator nur, wenn std:: allocator_traits < allocator_type > :: propagate_on_container_copy_assignment :: value true ist.
  • Move-Zuweisung ersetzt den Allokator nur, wenn std:: allocator_traits < allocator_type > :: propagate_on_container_move_assignment :: value true ist.
  • Swap ersetzt den Allokator nur, wenn std:: allocator_traits < allocator_type > :: propagate_on_container_swap :: value true ist. Konkret werden die Allokatorinstanzen durch einen unqualifizierten Aufruf der Nicht-Member-Funktion swap ausgetauscht, siehe Swappable . Wenn swap den Allokator nicht propagiert, ist das Austauschen zweier Container mit ungleichen Allokatoren undefiniertes Verhalten.
  • Der Accessor get_allocator() erhält eine Kopie des Allokators, der zur Konstruktion des Containers verwendet oder durch die letzte Allokatorersetzungsoperation installiert wurde.

Die einzige Ausnahme ist std:: basic_string < CharT,Traits,Allocator > :: assign , die auch den Allokator propagieren kann.

Inhaltsverzeichnis

Anforderungen

Ein Typ erfüllt AllocatorAwareContainer , wenn er Container erfüllt und, gegeben die folgenden Typen und Werte, die semantischen und Komplexitätsanforderungen in den folgenden Tabellen erfüllt:

Typ Definition
X ein AllocatorAwareContainer -Typ
T der value_type von X
A der von X verwendete Allokatortyp
Wert Definition
a , b nicht-konstante Lvalues vom Typ X
c ein Lvalue vom Typ const X
t ein Lvalue oder ein konstantes Rvalue vom Typ X
rv ein nicht-konstantes Rvalue vom Typ X
m ein Wert vom Typ A

Typen

Name Type Anforderung
typename X :: allocator_type A X::allocator_type::value_type und X::value_type sind identisch.

Anweisungen

Anweisung Semantik Komplexität
X u ;
X u = X ( ) ;
Vorbedingung A ist DefaultConstructible . Konstant
Nachbedingung u. empty ( ) und u. get_allocator ( ) == A ( ) sind beide true .
X u ( m ) ; Nachbedingung u. empty ( ) und u. get_allocator ( ) == m sind beide true . Konstant
X u ( t, m ) ; Vorbedingung T ist CopyInsertable in X . Linear
Nachbedingung u == t und u. get_allocator ( ) == m sind beide true .
X u ( rv ) ; Nachbedingung
  • u hat dieselben Elemente wie rv vor dieser Konstruktion.
  • Der Wert von u. get_allocator ( ) ist derselbe wie der Wert von rv. get_allocator ( ) vor dieser Konstruktion.
Konstant
X u ( rv, m ) ; Vorbedingung T ist MoveInsertable in X .
  • Konstant wenn m == rv. get_allocator ( ) true ist.
  • Andernfalls linear.
Nachbedingung
  • u hat dieselben Elemente oder Kopien der Elemente, die rv vor dieser Konstruktion hatte.
  • u. get_allocator ( ) == m ist true .

Ausdrücke

Ausdruck Typ Semantik Komplexität
c. get_allocator ( ) A Keine direkte semantische Anforderung. Konstant
a = t X& Vorbedingung T ist CopyInsertable in X und CopyAssignable . Linear
Nachbedingung a == t ist true .
a = rv X& Vorbedingung Falls der Allokator nicht durch Move-Zuweisung ersetzt wird (siehe oben ), dann ist T MoveInsertable in X und MoveAssignable . Linear
Effekt Alle existierenden Elemente von a werden entweder move-zugewiesen oder zerstört.
Nachbedingung Falls a und rv nicht auf dasselbe Objekt verweisen, ist a gleich dem Wert, den rv vor der Zuweisung hatte.
a. swap ( b ) void Effekt Tauscht die Inhalte von a und b aus. Konstant

Hinweise

AllocatorAwareContainer rufen stets std:: allocator_traits < A > :: construct ( m, p, args ) auf, um ein Objekt vom Typ T an der Stelle p mit args zu konstruieren, wobei m == get_allocator ( ) gilt. Die Standardimplementierung von construct in std::allocator ruft :: new ( ( void * ) p ) T ( args ) (bis C++20) std::allocator besitzt kein construct -Element und std:: construct_at ( p, args ) wird beim Konstruieren von Elementen aufgerufen (seit C++20) , spezialisierte Allokatoren können jedoch eine abweichende Definition wählen.

Standardbibliothek

Alle Standardbibliothek-String-Typen und Container (außer std::array und std:: inplace_vector ) sind AllocatorAwareContainer s:

Speichert und manipuliert Zeichenfolgen
(Klassentemplate)
Doppelseitige Warteschlange
(Klassentemplate)
Einfach verkettete Liste
(Klassentemplate)
Doppelt verkettete Liste
(Klassentemplate)
Veränderbares zusammenhängendes Array
(Klassentemplate)
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln sortiert, Schlüssel sind eindeutig
(Klassentemplate)
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln sortiert
(Klassentemplate)
Sammlung eindeutiger Schlüssel, nach Schlüsseln sortiert
(Klassentemplate)
Sammlung von Schlüsseln, nach Schlüsseln sortiert
(Klassentemplate)
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln gehasht, Schlüssel sind eindeutig
(Klassentemplate)
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln gehasht
(Klassentemplate)
Sammlung eindeutiger Schlüssel, nach Schlüsseln gehasht
(Klassentemplate)
Sammlung von Schlüsseln, nach Schlüsseln gehasht
(Klassentemplate)

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2839 C++11 Selbst-Zuweisung durch Verschieben bei Standardcontainern war nicht erlaubt erlaubt, aber das Ergebnis ist nicht spezifiziert