C++ named requirements: AllocatorAwareContainer (since C++11)
Un AllocatorAwareContainer es un Container que contiene una instancia de un Allocator y utiliza esa instancia en todas sus funciones miembro para asignar y liberar memoria y para construir y destruir objetos en esa memoria (tales objetos pueden ser elementos del contenedor, nodos o, para contenedores no ordenados, arreglos de cubos) , excepto que las especializaciones de std::basic_string no utilizan los allocators para la construcción/destrucción de sus elementos (desde C++23) .
Las siguientes reglas se aplican a la construcción de contenedores:
- Los constructores de copia de los AllocatorAwareContainer obtienen sus instancias del asignador llamando a std:: allocator_traits < allocator_type > :: select_on_container_copy_construction en el asignador del contenedor que se está copiando.
- Los constructores de movimiento obtienen sus instancias de asignadores mediante construcción por movimiento desde el asignador perteneciente al contenedor antiguo.
- Todos los demás constructores toman un parámetro const allocator_type & .
La única forma de reemplazar un allocator es mediante copy-assignment, move-assignment y swap:
- La asignación por copia reemplazará el asignador solo si std:: allocator_traits < allocator_type > :: propagate_on_container_copy_assignment :: value es true .
- La asignación por movimiento reemplazará el asignador solo si std:: allocator_traits < allocator_type > :: propagate_on_container_move_assignment :: value es true .
- El intercambio reemplazará el asignador solo si std:: allocator_traits < allocator_type > :: propagate_on_container_swap :: value es true . Específicamente, intercambiará las instancias del asignador mediante una llamada no calificada a la función no miembro swap, consulte Swappable . Si swap no propaga el asignador, intercambiar dos contenedores con asignadores desiguales es comportamiento indefinido.
-
El acceso
get_allocator()obtiene una copia del asignador que se utilizó para construir el contenedor o que se instaló mediante la operación de reemplazo de asignador más reciente.
La única excepción es std:: basic_string < CharT,Traits,Allocator > :: assign , que también puede propagar el asignador de memoria.
Contenidos |
Requisitos
Un tipo satisface AllocatorAwareContainer si satisface Container y, dados los siguientes tipos y valores, se cumplen los requisitos semánticos y de complejidad en las tablas siguientes:
| Tipo | Definición |
X
|
un tipo AllocatorAwareContainer |
T
|
el
value_type
de
X
|
A
|
el tipo de asignador utilizado por
X
|
| Valor | Definición |
| a , b |
lvalues no constantes de tipo
X
|
| c | un lvalue de tipo const X |
| t |
un lvalue o un rvalue constante de tipo
X
|
| rv |
un rvalue no constante de tipo
X
|
| m |
un valor de tipo
A
|
Tipos
| Nombre | Tipo | Requisito |
|---|---|---|
| typename X :: allocator_type |
A
|
X::allocator_type::value_type
y
X::value_type
son iguales.
|
Declaraciones
| Declaración | Semántica | Complejidad | |
|---|---|---|---|
|
X u
;
X u = X ( ) ; |
Precondición |
A
es
DefaultConstructible
.
|
Constante |
| Poscondición | u. empty ( ) y u. get_allocator ( ) == A ( ) son ambos true . | ||
| X u ( m ) ; | Poscondición | u. empty ( ) y u. get_allocator ( ) == m son ambos true . | Constante |
| X u ( t, m ) ; | Precondición |
T
es
CopyInsertable
en
X
.
|
Lineal |
| Poscondición | u == t y u. get_allocator ( ) == m son ambos true . | ||
| X u ( rv ) ; | Poscondición |
|
Constante |
| X u ( rv, m ) ; | Precondición |
T
es
MoveInsertable
en
X
.
|
|
| Poscondición |
|
||
Expresiones
| Expresión | Tipo | Semántica | Complejidad | |
|---|---|---|---|---|
| c. get_allocator ( ) |
A
|
No hay requisito semántico directo. | Constante | |
| a = t |
X&
|
Precondición |
T
es
CopyInsertable
en
X
y
CopyAssignable
.
|
Lineal |
| Postcondición | a == t es true . | |||
| a = rv |
X&
|
Precondición |
Si el asignador
no
será reemplazado por asignación de movimiento (ver
arriba
), entonces
T
es
MoveInsertable
en
X
y
MoveAssignable
.
|
Lineal |
| Efecto | Todos los elementos existentes de a son asignados por movimiento o destruidos. | |||
| Postcondición | Si a y rv no se refieren al mismo objeto, a es igual al valor que rv tenía antes de la asignación. | |||
| a. swap ( b ) | void | Efecto | Intercambia los contenidos de a y b . | Constante |
Notas
AllocatorAwareContainer
s siempre llaman a
std::
allocator_traits
<
A
>
::
construct
(
m, p, args
)
para construir un objeto de tipo
T
en
p
usando
args
, con
m
==
get_allocator
(
)
.
El
construct
por defecto en
std::allocator
llama a
::
new
(
(
void
*
)
p
)
T
(
args
)
(hasta C++20)
std::allocator
no tiene miembro
construct
y se llama a
std::
construct_at
(
p, args
)
al construir elementos
(desde C++20)
, pero los allocators especializados pueden elegir una definición diferente.
Biblioteca estándar
Todos los tipos de cadena y contenedores de la biblioteca estándar (excepto std::array y std:: inplace_vector ) son AllocatorAwareContainer s:
|
almacena y manipula secuencias de caracteres
(class template) |
|
|
cola de doble extremo
(class template) |
|
|
(C++11)
|
lista simplemente enlazada
(class template) |
|
lista doblemente enlazada
(class template) |
|
|
array contiguo redimensionable
(class template) |
|
|
colección de pares clave-valor, ordenados por claves, claves únicas
(class template) |
|
|
colección de pares clave-valor, ordenados por claves
(class template) |
|
|
colección de claves únicas, ordenadas por claves
(class template) |
|
|
colección de claves, ordenadas por claves
(class template) |
|
|
(C++11)
|
colección de pares clave-valor, hasheados por claves, claves únicas
(class template) |
|
(C++11)
|
colección de pares clave-valor, hasheados por claves
(class template) |
|
(C++11)
|
colección de claves únicas, hasheadas por claves
(class template) |
|
(C++11)
|
colección de claves, hasheadas por claves
(class template) |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2839 | C++11 | la auto-asignación de movimiento de contenedores estándar no estaba permitida | permitida pero el resultado no está especificado |