Namespaces
Variants

std::ranges::uninitialized_value_construct_n

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
 
Definido en el encabezado <memory>
Firma de llamada
template< /*nothrow-forward-iterator*/ I >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_value_construct_n( I first,
                                   std::iter_difference_t<I> count );
(1) (desde C++20)
(constexpr desde C++26)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_value_construct_n( Ep&& policy, I first,
                                   std::iter_difference_t<I> count );
(2) (desde C++26)

Para la definición de /*execution-policy*/, consulte esta página; para la definición de otros conceptos solo de exposición, consulte esta página.

1) Construye elementos en el rango de destino first + [0, count) mediante inicialización por valor como si fuera por

return ranges::uninitialized_value_construct(std::counted_iterator(first, count),
                                             std::default_sentinel).base();

Si se lanza una excepción durante la inicialización, los objetos ya construidos se destruyen en un orden no especificado.
2) Igual que (1), pero ejecutado según policy.

Las entidades similares a funciones descritas en esta página son objetos de función de algoritmo (informalmente conocidos como niebloids), es decir:

Parámetros

first - el comienzo del rango de elementos a inicializar
count - el número de elementos a construir
policy - la política de ejecución a utilizar

Valor de retorno

Como se describió anteriormente.

Excepciones

Cualquier excepción lanzada durante la construcción de los elementos en el rango de destino.

2) Durante el proceso de ejecución:
  • Si los recursos de memoria temporal necesarios para la paralelización no están disponibles, std::bad_alloc se lanza.
  • Si se lanza una excepción no capturada mientras se accede a objetos mediante un argumento de algoritmo, el comportamiento está determinado por la política de ejecución (para políticas estándar, std::terminate se invoca).

Notas

Una implementación puede mejorar la eficiencia de ranges::uninitialized_value_construct_n (usando por ejemplo ranges::fill_n) si el tipo de valor del rango es un CopyAssignable TrivialType.

Prueba de características macro Valor Estándar Característica
__cpp_lib_parallel_algorithm 202506L (C++26) Algoritmos de rango paralelos
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr para especializados <memory> algoritmos, (1)

Posible implementación

struct uninitialized_value_construct_n_fn
{
    template</*nothrow-forward-iterator*/ I>
        requires std::default_initializable<std::iter_value_t<I>>
    constexpr I operator()(I first, std::iter_difference_t<I> count) const
    {
        auto iter = std::counted_iterator(first, count);
        return ranges::uninitialized_value_construct(iter, std::default_sentinel).base();
    }
};

inline constexpr uninitialized_value_construct_n_fn uninitialized_value_construct_n{};

Ejemplo

#include <iostream>
#include <memory>
#include <string>
int main()
{
    struct S { std::string m{"█▓▒░ █▓▒░ █▓▒░ "}; };
    constexpr int n{4};
    alignas(alignof(S)) char out[n * sizeof(S)];
    try
    {
        auto first{reinterpret_cast<S*>(out)};
        auto last = std::ranges::uninitialized_value_construct_n(first, n);
        auto count{1};
        for (auto it{first}; it != last; ++it)
            std::cout << count++ << ' ' << it->m << '\n';
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
    // Para tipos escalares, uninitialized_value_construct_n
    // inicializa a cero el área de memoria no inicializada dada.
    int v[]{1, 2, 3, 4, 5, 6, 7, 8};
    std::cout << ' ';
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << "\n ";
    std::ranges::uninitialized_value_construct_n(std::begin(v), std::size(v));
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}

Salida:

1 █▓▒░ █▓▒░ █▓▒░ 
2 █▓▒░ █▓▒░ █▓▒░ 
3 █▓▒░ █▓▒░ █▓▒░ 
4 █▓▒░ █▓▒░ █▓▒░
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0

Véase también

construye objetos mediante inicialización de valor en un área de memoria no inicializada, definida por un rango
(objeto función de algoritmo)
construye objetos mediante inicialización por defecto en un área de memoria no inicializada, definida por un rango
(objeto función de algoritmo)
construye objetos mediante inicialización por defecto en un área de memoria no inicializada, definida por un inicio y un conteo
(objeto función de algoritmo)
construye objetos mediante inicialización de valor en un área de memoria no inicializada, definida por un inicio y un conteo
(plantilla de función)