std::allocator - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | |
|
|
(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 |
(hasta C++20) |
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 |
Funciones miembro
| Crea una nueva instancia de asignador. (función miembro pública) [editar] | |
| Destruye una instancia de asignador. (función miembro pública) [editar] | |
(hasta C++20) |
Obtiene la dirección de un objeto, incluso si operator& está sobrecargado. (función miembro pública) [editar] |
| Asigna almacenamiento no inicializado. (función miembro pública) [editar] | |
(C++23) |
Asigna almacenamiento al menos tan grande como el tamaño solicitado. (función miembro pública) [editar] |
| Desasigna almacenamiento. (función miembro pública) [editar] | |
(hasta C++20) |
Devuelve el mayor tamaño de asignación admitido. (función miembro pública) [editar] |
(hasta C++20) |
Construye un objeto en almacenamiento asignado. (función miembro pública) [editar] |
(hasta C++20) |
Destruye un objeto en almacemiento asignado. (función miembro pública) [editar] |
Funciones no miembro
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.
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: