C++ named requirements: AllocatorAwareContainer (since C++11)
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
trueist. -
Move-Zuweisung ersetzt den Allokator nur, wenn
std::
allocator_traits
<
allocator_type
>
::
propagate_on_container_move_assignment
::
value
trueist. -
Swap ersetzt den Allokator nur, wenn
std::
allocator_traits
<
allocator_type
>
::
propagate_on_container_swap
::
value
trueist. 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 |
|
Konstant |
| X u ( rv, m ) ; | Vorbedingung |
T
ist
MoveInsertable
in
X
.
|
|
| Nachbedingung |
|
||
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) |
|
|
(C++11)
|
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) |
|
|
(C++11)
|
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln gehasht, Schlüssel sind eindeutig
(Klassentemplate) |
|
(C++11)
|
Sammlung von Schlüssel-Wert-Paaren, nach Schlüsseln gehasht
(Klassentemplate) |
|
(C++11)
|
Sammlung eindeutiger Schlüssel, nach Schlüsseln gehasht
(Klassentemplate) |
|
(C++11)
|
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 |