Namespaces
Variants

std::inplace_vector<T,N>::inplace_vector

De es.cppreference.net
 
 
 
 
constexpr inplace_vector() noexcept;
(1) (desde C++26)
constexpr explicit inplace_vector( size_type count );
(2) (desde C++26)
constexpr inplace_vector( size_type count, const T& value );
(3) (desde C++26)
template< class InputIt >
constexpr inplace_vector( InputIt first, InputIt last );
(4) (desde C++26)
template< /*container-compatible-range*/<T> R >
constexpr inplace_vector( std::from_range_t, R&& rg );
(5) (desde C++26)
constexpr inplace_vector( const inplace_vector& other );
(6) (desde C++26)
constexpr inplace_vector( inplace_vector&& other )
    noexcept(N == 0 || std::is_nothrow_move_constructible_v<T>);
(7) (desde C++26)
constexpr inplace_vector( std::initializer_list<T> init );
(8) (desde C++26)

Construye un nuevo inplace_vector a partir de una variedad de fuentes de datos.

1) Construye un inplace_vector vacío.
2) Construye un inplace_vector con elementos count inicializados por valor.
3) Construye un inplace_vector con count copias de elementos con valor value.
4) Construye un inplace_vector con el contenido del rango [first, last).
5) Construye un inplace_vector con el contenido del rango rg.
Para la definición de /*container-compatible-range*/, consulte ranges::to.
El programa está mal formado si ranges::size(rg) es una expresión constante y es mayor que N.
6) Constructor de copia. Construye un inplace_vector con la copia del contenido de other.
El constructor es trivial si N > 0 y std::is_trivially_copy_constructible_v<T> son ambos true.
7) Constructor de movimiento. Construye un inplace_vector con el contenido de other usando semántica de movimiento.
El constructor es trivial si N > 0 y std::is_trivially_move_constructible_v<T> son ambos true.
8) Construye un inplace_vector con el contenido de la lista de inicialización init.

Parámetros

count - el tamaño del contenedor
value - el valor para inicializar los elementos del contenedor
first, last - el par de iteradores que define el rango fuente de elementos a copiar
rg - el rango de valores para inicializar los elementos del contenedor
other - otro inplace_vector que se usará como fuente para inicializar los elementos del contenedor
init - lista de inicialización para inicializar los elementos del contenedor
Requisitos de tipo
-
T debe cumplir con los requisitos de DefaultInsertable para usar las sobrecargas (2,3).

Complejidad

1) Constante.
2,3) Lineal en count .
4) Lineal en std:: distance ( first, last ) .
5) Lineal en std :: ranges:: distance ( rg ) .
6,7) Lineal en el tamaño de other .
8) Lineal en tamaño de init .

Excepciones

2,3) Lanza std::bad_alloc si count > N .
5) Lanza std::bad_alloc si std :: ranges:: size ( rg ) > N .
8) Lanza std::bad_alloc si init. size ( ) > N .

Ejemplo

#include <cassert>
#include <initializer_list>
#include <inplace_vector>
#include <new>
#include <print>
#include <ranges>

int main()
{
    std::inplace_vector<int, 4> v1; // overload (1)
    assert(v1.size() == 0 && v1.capacity() == 4);
    
    std::inplace_vector<int, 0> v2; // overload (1), N == 0 is allowed
    assert(v2.size() == 0 && v2.capacity() == 0);
    
    std::inplace_vector<int, 5> v3(3); // overload (2)
    assert(v3.size() == 3 && v3.capacity() == 5);
    std::println("v3 = {}", v3);
    
    try
    {
        std::inplace_vector<int, 3> v(4); // overload (2), throws: count > N
    }
    catch(const std::bad_alloc& ex1)
    {
        std::println("ex1.what(): {}", ex1.what());
    }
    
    std::inplace_vector<int, 5> v4(3, 42); // overload (3)
    assert(v4.size() == 3 && v4.capacity() == 5);
    std::println("v4 = {}", v4);
    
    try
    {
        std::inplace_vector<int, 3> v(4, 2); // overload (3), throws: count > N
    }
    catch(const std::bad_alloc& ex2)
    {
        std::println("ex2.what(): {}", ex2.what());
    }
    
    const auto init = {1, 2, 3};
    
    std::inplace_vector<int, 4> v5(init.begin(), init.end()); // overload (4)
    assert(v5.size() == 3 && v5.capacity() == 4);
    std::println("v5 = {}", v5);
    
    std::inplace_vector<int, 4> v6(std::from_range, init); // overload (5)
    assert(v6.size() == 3 && v6.capacity() == 4);
    std::println("v6 = {}", v6);
    
    std::inplace_vector<int, 4> v7(v6); // overload (6)
    assert(v7.size() == 3 && v7.capacity() == 4);
    std::println("v7 = {}", v7);
    assert(v6.size() == 3);
    
    std::inplace_vector<int, 4> v8(std::move(v6)); // overload (7)
    // Note that after the move v6 is left in valid but indeterminate state.
    assert(v8.size() == 3 && v8.capacity() == 4);
    std::println("v8 = {}", v8);
    
    std::inplace_vector<int, 4> v9(init); // overload (8)
    assert(v9.size() == 3 && v9.capacity() == 4);
    std::println("v9 = {}", v9);
    
    try
    {
        std::inplace_vector<int, 2> v(init); // overload (8), throws: init.size() > N
    }
    catch(const std::bad_alloc& ex3)
    {
        std::println("ex3.what(): {}", ex3.what());
    }
}

Posible salida:

v3 = [0, 0, 0]
ex1.what(): std::bad_alloc
v4 = [42, 42, 42]
ex2.what(): std::bad_alloc
v5 = [1, 2, 3]
v6 = [1, 2, 3]
v7 = [1, 2, 3]
v8 = [1, 2, 3]
v9 = [1, 2, 3]
ex3.what(): std::bad_alloc

Véase también

asigna valores al contenedor
(función miembro pública)
[static]
devuelve el número de elementos que pueden almacenarse en el almacenamiento actualmente asignado
(función miembro estática pública)
acceso directo al almacenamiento contiguo subyacente
(función miembro pública)
devuelve el número de elementos
(función miembro pública)
(C++17) (C++20)
devuelve el tamaño de un contenedor o array
(plantilla de función)
(C++17)
obtiene el puntero al array subyacente
(plantilla de función)