Namespaces
Variants

std::inplace_vector

De es.cppreference.net
 
 
 
 
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[] o at() – 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_vector invalida todos los iteradores;
  • intercambiar dos inplace_vector s 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)
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

especializa el algoritmo std::swap
(plantilla de función)
borra todos los elementos que cumplen criterios específicos
(plantilla de función)
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 .