std::inplace_vector
| Definido en el encabezado <inplace_vector>
|
||
template<
class T,
std::size_t N
> struct inplace_vector;
|
(desde C++26) | |
std::inplace_vector es un arreglo redimensionable dinámicamente con almacenamiento contiguo inplace. Los elementos de tipo T se almacenan y alinean adecuadamente dentro del propio objeto. La capacidad del almacenamiento interno se fija en tiempo de compilación y es igual a N.
Los elementos se almacenan de forma contigua, lo que significa que se puede acceder a ellos no solo a través de iteradores o operator[] de acceso aleatorio, sino también usando desplazamientos a punteros regulares a los elementos. Un puntero a un elemento de un inplace_vector se puede pasar a cualquier función que espere un puntero a un elemento de un arreglo C.
std::inplace_vector cumple con los requisitos de Container, ReversibleContainer, ContiguousContainer y SequenceContainer, incluyendo la mayoría de los requisitos opcionales de contenedor secuencial, excepto que las push_front, emplace_front, pop_front y prepend_range funciones miembro no están proporcionadas.
Para cualquier N, std::inplace_vector<T, N>::iterator y std::inplace_vector<T, N>::const_iterator cumplen con los requisitos de ConstexprIterator.
La especialización std::inplace_vector<T, 0> es TriviallyCopyable y está vacía. std::is_trivially_default_constructible_v<std::inplace_vector<T, 0>> también es true.
Cualquier función miembro de std::inplace_vector<T, N> que causaría una inserción más allá de la capacidad N lanza std::bad_alloc.
La complejidad de las operaciones comunes en inplace_vectors es la siguiente:
- Acceso aleatorio a un elemento mediante
operator[]oat()– constante: 𝓞(1). - Inserción o eliminación de un elemento al final – constante: 𝓞(1).
- Inserción o eliminación de elementos al final – lineal en el número de elementos insertados/eliminados: 𝓞(n).
- Inserción o eliminación de elementos al principio o en el medio – lineal en el número de elementos insertados/eliminados más la distancia al final del vector: 𝓞(n).
Invalidación de iteradores
std::inplace_vector
las garantías de invalidación de iteradores difieren de
std::vector
:
-
mover un
inplace_vectorinvalida todos los iteradores; -
intercambiar dos
inplace_vectors invalida todos los iteradores (durante el intercambio, el iterador continuará apuntando al mismo elemento del array, y por lo tanto podría cambiar su valor).
Las siguientes funciones miembro potencialmente invalidan iteradores:
operator=
,
assign
,
assign_range
,
clear
,
emplace
,
erase
,
insert
,
insert_range
,
pop_back
,
resize
, y
swap
.
Las siguientes funciones miembro potencialmente invalidan
end
únicamente el iterador:
append_range
,
emplace_back
,
push_back
,
try_append_range
,
try_emplace_back
,
try_push_back
,
unchecked_emplace_back
, y
unchecked_push_back
.
Parámetros de plantilla
| T | - | tipo de elemento. Debe ser MoveConstructible y MoveAssignable . |
| N | - |
capacidad, es decir, el número máximo de elementos en el
inplace_vector
(puede ser
0
).
|
Tipos de miembros
| Tipo | Definición |
value_type
|
T
|
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
reference
|
value_type&
|
const_reference
|
const value_type&
|
pointer
|
value_type*
|
const_pointer
|
const value_type*
|
iterator
|
definido por la implementación LegacyRandomAccessIterator y random_access_iterator a value_type
|
const_iterator
|
definido por la implementación LegacyRandomAccessIterator, ConstexprIterator y random_access_iterator a const value_type
|
reverse_iterator
|
std::reverse_iterator<iterator>
|
const_reverse_iterator
|
std::reverse_iterator<const_iterator>
|
Funciones miembro
construye el
inplace_vector
(función miembro pública) |
|
destruye el
inplace_vector
(función miembro pública) |
|
|
asigna valores al contenedor
(función miembro pública) |
|
|
asigna valores al contenedor
(función miembro pública) |
|
|
asigna un rango de valores al contenedor
(función miembro pública) |
|
Acceso a elementos |
|
|
acceder al elemento especificado con verificación de límites
(función miembro pública) |
|
|
acceder al elemento especificado
(función miembro pública) |
|
|
acceder al primer elemento
(función miembro pública) |
|
|
acceder al último elemento
(función miembro pública) |
|
|
acceso directo al almacenamiento contiguo subyacente
(función miembro pública) |
|
Iteradores |
|
|
devuelve un iterador al inicio
(función miembro pública) |
|
|
devuelve un iterador al final
(función miembro pública) |
|
|
devuelve un iterador inverso al principio
(función miembro pública) |
|
|
devuelve un iterador inverso al final
(función miembro pública) |
|
Tamaño y capacidad |
|
|
comprueba si el contenedor está vacío
(función miembro pública) |
|
|
devuelve el número de elementos
(función miembro pública) |
|
|
[static]
|
devuelve el número máximo posible de elementos
(función miembro pública estática) |
|
[static]
|
devuelve el número de elementos que pueden almacenarse en el almacenamiento actualmente asignado
(función miembro pública estática) |
|
cambia el número de elementos almacenados
(función miembro pública) |
|
|
[static]
|
reserva almacenamiento
(función miembro pública estática) |
|
[static]
|
reduce el uso de memoria liberando memoria no utilizada
(función miembro pública estática) |
Modificadores |
|
|
inserta elementos
(función miembro pública) |
|
|
inserta un rango de elementos
(función miembro pública) |
|
|
construye el elemento in situ
(función miembro pública) |
|
|
construye un elemento en el lugar al final
(función miembro pública) |
|
|
intenta construir un elemento in situ al final
(función miembro pública) |
|
|
construye incondicionalmente un elemento in situ al final
(función miembro pública) |
|
|
añade un elemento al final
(función miembro pública) |
|
|
intenta agregar un elemento al final
(función miembro pública) |
|
|
agrega incondicionalmente un elemento al final
(función miembro pública) |
|
|
elimina el último elemento
(función miembro pública) |
|
|
añade un rango de elementos al final
(función miembro pública) |
|
|
intenta agregar un rango de elementos al final
(función miembro pública) |
|
|
borra el contenido
(función miembro pública) |
|
|
elimina elementos
(función miembro pública) |
|
|
intercambia los contenidos
(función miembro pública) |
|
Funciones no miembro
|
(C++26)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
borra todos los elementos que cumplen criterios específicos
(plantilla de función) |
|
|
(C++26)
|
compara lexicográficamente los valores de dos
inplace_vector
s
(plantilla de función) |
Notas
El número de elementos en un inplace_vector puede variar dinámicamente hasta una capacidad fija porque los elementos se almacenan dentro del objeto mismo de manera similar a std::array. Sin embargo, los objetos se inicializan a medida que se insertan en inplace_vector a diferencia de los arrays de C o std::array, que deben construir todos los elementos al momento de la instanciación.
inplace_vector es útil en entornos donde las asignaciones de memoria dinámica no son deseadas.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_inplace_vector |
202406L |
(C++26) | std::inplace_vector: vector redimensionable dinámicamente con almacenamiento in situ de capacidad fija
|
202603L |
(C++26) | Mejor tipo de retorno para try_push_back() y try_emplace_back(). Eliminado try_append_range()
| |
__cpp_lib_constexpr_inplace_vector |
202502L |
(C++26) | Constexpr std::inplace_vector para tipos de elementos no triviales
|
Ejemplo
#include <algorithm>
#include <array>
#include <cassert>
#include <inplace_vector>
#include <optional>
int main()
{
std::inplace_vector<int, 4> v1{0, 1, 2};
assert(v1.max_size() == 4);
assert(v1.capacity() == 4);
assert(v1.size() == 3);
assert(std::ranges::equal(v1, std::array{0, 1, 2}));
assert(v1[0] == 0);
assert(v1.at(0) == 0);
assert(v1.front() == 0);
assert(*v1.begin() == 0);
assert(v1.back() == 2);
v1.push_back(3);
assert(v1.back() == 3);
assert(std::ranges::equal(v1, std::array{0, 1, 2, 3}));
v1.resize(3);
assert(std::ranges::equal(v1, std::array{0, 1, 2}));
assert(v1.try_push_back(3) != std::nullopt);
assert(v1.back() == 3);
assert(v1.size() == 4);
assert(v1.try_push_back(13) == std::nullopt); // no place
assert(v1.back() == 3);
assert(v1.size() == 4);
v1.clear();
assert(v1.size() == 0);
assert(v1.empty());
}
Véase también
|
arreglo contiguo redimensionable
(class template) |
|
|
(C++11)
|
arreglo contiguo de tamaño fijo in situ
(class template) |
|
cola de doble extremo
(class template) |
Enlaces externos
| 1. |
inplace_vector
— Una implementación de referencia de
P0843R14
(
std::inplace_vector
).
|
| 2. |
static_vector
— Boost.Container implementa el vector in situ como un tipo independiente con sus propias garantías.
|
| 3. |
fixed_vector
— EASTL implementa el vector in situ mediante un parámetro de plantilla adicional.
|
| 4. |
small_vector
— Folly también implementa el vector in situ mediante un parámetro de plantilla adicional.
|
| 5. |
stack_alloc
— Los asignadores personalizados de Howard Hinnant que emulan
std::inplace_vector
sobre
std::vector
.
|