Namespaces
Variants

std:: inplace_vector

From cppreference.net
Definido en el encabezado <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(desde C++26)

inplace_vector es un arreglo de tamaño dinámico con almacenamiento local contiguo. Los elementos de tipo T se almacenan y alinean correctamente 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 mediante iteradores o el operator [ ] de acceso aleatorio, sino también utilizando desplazamientos a punteros regulares a elementos. Un puntero a un elemento de un inplace_vector puede pasarse a cualquier función que espere un puntero a un elemento de un array de C.

El inplace_vector modela Container , ReversibleContainer , ContiguousContainer , y SequenceContainer , incluyendo la mayoría de los requisitos opcionales de contenedor secuencial , excepto que las funciones miembro push_front , emplace_front , pop_front , y prepend_range no están proporcionadas.

Para cualquier N positivo, 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_vector s 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) .

Contenidos

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 (desde C++26) 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 propio objeto de manera similar a std::array . Sin embargo, los objetos se inicializan a medida que se insertan en el inplace_vector a diferencia de los arrays de C o std::array , que deben construir todos los elementos al instanciarse.

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 local de capacidad fija
__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>
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) != nullptr);
    assert(v1.back() == 3);
    assert(v1.size() == 4);
    assert(v1.try_push_back(13) == nullptr); // sin espacio
    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 .