Namespaces
Variants

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

From cppreference.net
C++ named requirements

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
  • u tiene los mismos elementos que rv tenía antes de esta construcción.
  • El valor de u. get_allocator ( ) es el mismo que el valor de rv. get_allocator ( ) antes de esta construcción.
Constante
X u ( rv, m ) ; Precondición T es MoveInsertable en X .
  • Constante si m == rv. get_allocator ( ) es true .
  • En caso contrario, lineal.
Poscondición
  • u tiene los mismos elementos, o copias de los elementos, que rv tenía antes de esta construcción.
  • u. get_allocator ( ) == m es true .

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)
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)
colección de pares clave-valor, hasheados por claves, claves únicas
(class template)
colección de pares clave-valor, hasheados por claves
(class template)
colección de claves únicas, hasheadas por claves
(class template)
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