Espacios de nombres
Variantes
Acciones

std::inplace_vector

De cppreference.com
< cpp‎ | container
 
 
 
 
Definido en el archivo de encabezado <inplace_vector>
template<

    class T,
    std::size_t N

>struct inplace_vector;
(desde C++26)

inplace_vector es un array redimensionable dinámicamente con almacenamiento in situ contiguo. Los elementos del tipo T se almacenan y se alinean correctamente dentro del objeto mismo. 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 los elementos no solo a través de iteradores o operator[] de acceso aleatorio, sino también mediante desplazamientos a punteros regulares a 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 array de C.

inplace_vector modela Contenedor, ContenedorReversible, ContenedorContiguo y ContenedorDeSecuencia, incluidos la mayoría de los requisitos opcionales de los contenedores de secuencia, excepto que no se proporcionan las funciones miembro push_front, emplace_front, pop_front y prepend_range.

Para cualquier N positiva, std::inplace_vector<T, N>::iterator y std::inplace_vector<T, N>::const_iterator cumplen con los requisitos de IteradorConstexpr.

Para cualquier N positiva, si T no es TrivialmenteCopiable o std::is_trivially_default_constructible_v<T> es false, entonces las funciones miembro de inplace_vector no son utilizables en expresiones constantes.

La especialización std::inplace_vector<T, 0> es TrivialmenteCopiable 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 provoque una inserción más allá de la capacidad N genera std::bad_alloc.

La complejidad de las operaciones comunes en los vectores inplace_vector 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 hasta el final del vector: 𝓞(n).

Contenido

[editar]Invalidación de iteradores

Las garantías de invalidación de iteradores de std::inplace_vector difieren de las de std::vector:

  • mover un inplace_vector invalida todos los iteradores;
  • intercambiar dos inplace_vector invalida todos los iteradores (durante el intercambio, el iterador seguirá apuntando al mismo elemento del array y, por lo tanto, puede cambiar su valor).

Las siguientes funciones miembro potencialmente invalidan los iteradores: operator=, assign, assign_range, clear, emplace, erase, insert, insert_range, pop_back, resize, and swap.

Las siguientes funciones miembro potencialmente invalidan únicamente el iterador end: append_range, emplace_back, push_back, try_append_range, try_emplace_back, try_push_back, unchecked_emplace_back, and unchecked_push_back.

[editar]Parámetros de plantilla

T - Tipo de elemento. Debe ser ConstruiblePorMovimiento y AsignablePorMovimiento.
N - Capacidad. Es decir, la cantidad máxima de elementos en el vector_inplace (puede ser 0).

[editar]Tipos miembro

Tipo Definición
reverse_iteratorstd::reverse_iterator<iterator>[editar]
const_reverse_iteratorstd::reverse_iterator<const_iterator>[editar]

[editar]Funciones miembro

Construye el contenedor inplace_vector.
(función miembro pública)[editar]
Destruye el contenedor inplace_vector.
(función miembro pública)[editar]
Asigna valores al contenedor.
(función miembro pública)[editar]
Asigna valores al contenedor.
(función miembro pública)[editar]
Asigna un rango de valores al contenedor.
(función miembro pública)[editar]
Acceso a elementos
Accede al elemento especificado con comprobación de límites.
(función miembro pública)[editar]
Accede el elemento especificado.
(función miembro pública)[editar]
Accede al primer elemento.
(función miembro pública)[editar]
Accede al último elemento.
(función miembro pública)[editar]
Acceso directo al array subyacente.
(función miembro pública)[editar]
Iteradores
Devuelve un iterador al principio.
(función miembro pública)[editar]
(C++11)
Devuelve un iterador al final.
(función miembro pública)[editar]
Devuelve un iterador inverso al principio.
(función miembro pública)[editar]
Devuelve un iterador inverso al final.
(función miembro pública)[editar]
Tamaño y Capacidad
Comprueba si el contenedor está vacío.
(función miembro pública)[editar]
Devuelve el número de elementos.
(función miembro pública)[editar]
Devuelve el número máximo posible de elementos.
(función miembro pública)[editar]
Devuelve el número de elementos que se pueden almacenar en el almacenamiento asignado actualmente.
(función miembro pública)[editar]
Cambia el número de elementos almacenados.
(función miembro pública)[editar]
Reserva almacenamiento.
(función miembro pública)[editar]
Reduce el uso de memoria liberando memoria no utilizada.
(función miembro pública)[editar]
Modificadores
Inserta elementos
(función miembro pública)[editar]
Inserta un rango de elementos.
(función miembro pública)[editar]
(C++11)
Construye el elemento en el sitio.
(función miembro pública)[editar]
Construye un elemento en el sitio al final.
(función miembro pública)[editar]
Trata de construir un elemento in situ al final.
(función miembro pública)[editar]
Incondicionalmente construye un elemento in situ al final.
(función miembro pública)[editar]
Agrega elementos al final.
(función miembro pública)[editar]
Trata de agregar un elemento al final.
(función miembro pública)[editar]
Incondicionalmente agrega un elemento al final.
(función miembro pública)[editar]
Remueve el último elemento.
(función miembro pública)[editar]
Agrega un rango de elementos al final.
(función miembro pública)[editar]
Trata de agregar un rango de elementos al final.
(función miembro pública)[editar]
Borra el contenido.
(función miembro pública)[editar]
Borra elementos
(función miembro pública)[editar]
Intercambia el contenido.
(función miembro pública)[editar]

[editar]Funciones no miembro

Especializa el algoritmo std::swap.
(plantilla de función)[editar]
Borra todos los elementos que satisfacen un criterio específico.
(plantilla de función)[editar]
(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(C++20)
Compara lexicográficamente los valores de inplace_vector.
(plantilla de función)[editar]

[editar]Notas

La cantidad 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 en la ejemplarización.

inplace_vector es útil en entornos donde las asignaciones de memoria dinámicas no son deseadas.


Macro de Prueba de característicaValorEstándarComentario
__cpp_lib_inplace_vector202406L(C++26)std::inplace_vector: Vector redimensionable dinámicamente con capacidad fija de almacenamiento in situ.

[editar]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);// no hay lugarassert(v1.back()==3);assert(v1.size()==4); v1.clear();assert(v1.size()==0);assert(v1.empty());}


[editar]Véase también

Array dinámico contiguo.
(plantilla de clase)[editar]
(C++11)
Array estático contiguo.
(plantilla de clase)[editar]
Cola doblemente terminada (deque).
(plantilla de clase)[editar]

[editar]Enlaces externos

 inplace_vector — Una implementación de referencia de P0843R14 (std::inplace_vector).
 static_vector — Boost.Container implementa un vector in situ como un tipo independiente con sus propias garantías.
 fixed_vector — EASTL implementa un vector in situ a través de un parámetro de plantilla adicional.
 small_vector — Folly también implementa un vector in situ a través de un parámetro de plantilla adicional.
 stack_alloc — Los asignadores de memoria personalizados de Howard Hinnant's que emulan std::inplace_vector sobre std::vector.
close