std::allocator
Definido en el archivo de encabezado <memory>
|
||
template< class T > struct allocator; |
(1) | |
template<> struct allocator<void>; |
(2) | (en desuso en C++17) (eliminado en C++20) |
La plantilla de clase std::allocator
es el Allocator utilizado por todos los contenedores de la biblioteca estándar si no se proporciona un asignador especificado por el usuario. El asignador por defecto no tiene estado, es decir, todas las instancias del asignador dado son intercambiables, se comparan iguales y pueden desasignar la memoria asignada por cualquier otra instancia del mismo tipo de asignador.
La especialización explícita para void carece de los |
(hasta C++20) |
El asignador por defecto satisface los requerimientos de completitud de asignador. |
(desde C++17) |
Contenido |
[editar] Tipos miembro
Tipo | Definición |
value_type
|
T |
pointer (en desuso en C++17)(eliminado en C++20)
|
T* |
const_pointer (en desuso en C++17)(eliminado en C++20)
|
const T* |
reference (en desuso en C++17)(eliminado en C++20)
|
T& |
const_reference (en desuso en C++17)(eliminado en C++20)
|
const T& |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
propagate_on_container_move_assignment (C++14)
|
std::true_type |
rebind (en desuso en C++17)(eliminado en C++20)
|
template< class U > struct rebind { typedef allocator<U> other; |
is_always_equal (C++17)(en desuso en C++23)
|
std::true_type |
[editar] Funciones miembro
Crea una nueva instancia de asignador. (función miembro pública) | |
Destruye una instancia de asignador. (función miembro pública) | |
(hasta C++20) |
Obtiene la dirección de un objeto, incluso si operator& está sobrecargado. (función miembro pública) |
Asigna almacenamiento no inicializado. (función miembro pública) | |
(C++23) |
Asigna almacenamiento al menos tan grande como el tamaño solicitado. (función miembro pública) |
Desasigna almacenamiento. (función miembro pública) | |
(hasta C++20) |
Devuelve el mayor tamaño de asignación admitido. (función miembro pública) |
(hasta C++20) |
Construye un objeto en almacenamiento asignado. (función miembro pública) |
(hasta C++20) |
Destruye un objeto en almacemiento asignado. (función miembro pública) |
[editar] Funciones no miembro
Compara dos instancias de asignador. (función miembro pública) |
[editar] Notas
La plantilla de clase miembro rebind
proporciona una forma de obtener un asignador para un tipo diferente. Por ejemplo, std::list<T, A>
asigna nodos de algún tipo interno Node<T>
, utilizando el asignador A::rebind<Node<T>>::other (hasta C++11)std::allocator_traits<A>::rebind_alloc<Node<T>>, que se implementa en términos de A::rebind<Node<T>>::other si A es un std::allocator
(desde C++11).
El tipo miembro is_always_equal
está en desuso por Asunto LWG 3170, porque hace que por defecto los asignadores personalizados derivados de std::allocator
sean tratados como siempre iguales. std::allocator_traits<std::allocator<T>>::is_always_equal no está en desuso y su constante miembro value
es true para cualquier T
.
[editar] Ejemplo
#include <memory> #include <iostream> #include <string> int main() { { // asignador por defecto para enteros std::allocator<int> alloc; // demostrando los pocos miembros directamente utilizables static_assert(std::is_same_v<int, decltype(alloc)::value_type>); int* p = alloc.allocate(1); // espacio para un entero alloc.deallocate(p, 1); // y se fue // sin embargo, incluso esos pueden usarse a través de rasgos, // así que no es necesario using traits_t = std::allocator_traits<decltype(alloc)>; // el rasgo coincidente p = traits_t::allocate(alloc, 1); traits_t::construct(alloc, p, 7); // construir el entero std::cout << *p << '\n'; traits_t::deallocate(alloc, p, 1); // desasignar el espacio para un entero } { // asignador por defecto para cadenas std::allocator<std::string> alloc; // matching traits using traits_t = std::allocator_traits<decltype(alloc)>; // revincular el asignador usando el rasgo para cadenas obtiene el mismo tipo traits_t::rebind_alloc<std::string> alloc_ = alloc; std::string* p = traits_t::allocate(alloc, 2); // espacio para dos cadenas traits_t::construct(alloc, p, "foo"); traits_t::construct(alloc, p + 1, "bar"); std::cout << p[0] << ' ' << p[1] << '\n'; traits_t::destroy(alloc, p + 1); traits_t::destroy(alloc, p); traits_t::deallocate(alloc, p, 2); } }
Salida:
7 foo bar
[editar] Véase también
(C++11) |
Proporciona información sobre los tipos de asignadores. (plantilla de clase) |
(C++11) |
Implementa un asignador multinivel para contenedores multinivel. (plantilla de clase) |
(C++11) |
Comprueba si el tipo especificado admite construcción con uso de asignador. (plantilla de clase) |