Namespaces
Variants

std::ranges::uninitialized_copy, std::ranges::uninitialized_copy_result

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)

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

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montón
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< std::input_iterator I, std::sentinel_for<I> S1,
          /*nothrow-forward-iterator*/ O, /*nothrow-sentinel-for*/<O> S2 >
    requires std::constructible_from<std::iter_value_t<O>,
                                     std::iter_reference_t<I>>
uninitialized_copy_result<I, O>
    uninitialized_copy( I ifirst, S1 ilast, O ofirst, S2 olast );
(1) (desde C++20)
(constexpr desde C++26)
template< ranges::input_range IR, /*nothrow-forward-range*/ OR >
    requires std::constructible_from<ranges::range_value_t<OR>,
                                     ranges::range_reference_t<IR>>
uninitialized_copy_result<ranges::borrowed_iterator_t<IR>,
                          ranges::borrowed_iterator_t<OR>>
    uninitialized_copy( IR&& in_range, OR&& out_range );
(2) (desde C++20)
(constexpr desde C++26)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I, std::sized_sentinel_for<I> S1,
          /*nothrow-random-access-iterator*/ O,
          /*nothrow-sized-sentinel-for*/<O> S2 >
    requires std::constructible_from<std::iter_value_t<O>,
                                     std::iter_reference_t<I>>
uninitialized_copy_result<I, O>
    uninitialized_copy( Ep&& policy, I ifirst, S1 ilast, O ofirst, S2 olast );
(3) (desde C++26)
template< /*execution-policy*/ Ep, /*sized-random-access-range*/ IR,
          /*nothrow-sized-random-access-range*/ OR >
    requires std::constructible_from<ranges::range_value_t<OR>,
                                     ranges::range_reference_t<IR>>
uninitialized_copy_result<ranges::borrowed_iterator_t<IR>,
                          ranges::borrowed_iterator_t<OR>>
    uninitialized_copy( Ep&& policy, IR&& in_range, OR&& out_range );
(4) (desde C++26)
Tipos auxiliares
template< class I, class O >
using uninitialized_copy_result = ranges::in_out_result<I, O>;
(5) (desde C++20)

Para la definición de /*execution-policy*/, véase esta página; para la definición de /*sized-random-access-range*/, véase esta página; para la definición de otros conceptos de solo exposición, véase esta página.

1) Construye elementos en el rango de destino [ofirst, olast) a partir de elementos en el rango de origen [ifirst, ilast) como si por

for (; ifirst != ilast && ofirst != olast; ++ofirst, (void)++ifirst)
    ::new (voidify(*ofirst)) std::remove_reference_t<std::iter_reference_t<O>>(*ifirst);
return {std::move(ifirst), ofirst};

Si se lanza una excepción durante la inicialización, los objetos ya construidos se destruyen en un orden no especificado.
Si [ofirst, olast) se solapa con [ifirst, ilast), el comportamiento no está definido.
2) Igual que (1), pero usa in_range como rango de origen y out_range como rango de destino.
3,4) Igual que (1,2), pero ejecutado de acuerdo a policy.

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

Parámetros

ifirst, ilast - el par iterador-centinela que define el rango fuente de elementos a copiar
in_range - el rango de elementos a copiar
ofirst, olast - el par iterador-centinela que define el rango destino de elementos
out_range - el destino rango
policy - la política de ejecución a usar

Valor de retorno

Como se describió anteriormente.

Excepciones

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

3,4) Durante el proceso de ejecución:
  • Si los recursos de memoria temporales requeridos 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 a través de un argumento de algoritmo, el comportamiento se determina según 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_copy si el tipo de valor del rango de salida es TrivialType.

Macro de prueba de características Valor Est. Característica
__cpp_lib_parallel_algorithm 202506L (C++26) Algoritmos de rango paralelo
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr para especializados <memory>algoritmos, (1,2)

Posible implementación

struct uninitialized_copy_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S1,
             /*nothrow-forward-iterator*/ O, /*nothrow-sentinel-for*/<O> S2>
        requires std::constructible_from<std::iter_value_t<O>, std::iter_reference_t<I>>
    constexpr ranges::uninitialized_copy_result<I, O>
        operator()(I ifirst, S1 ilast, O ofirst, S2 olast) const
    {
        O current{ofirst};
        try
        {
            for (; !(ifirst == ilast or current == olast); ++ifirst, ++current)
                ranges::construct_at(std::addressof(*current), *ifirst);
            return {std::move(ifirst), std::move(current)};
        }
        catch (...) // rollback: destroy constructed elements
        {
            for (; ofirst != current; ++ofirst)
                ranges::destroy_at(std::addressof(*ofirst));
            throw;
        }
    }
    
    template<ranges::input_range IR, /*nothrow-forward-range*/ OR>
        requires std::constructible_from<ranges::range_value_t<OR>,
                                         ranges::range_reference_t<IR>>
    constexpr ranges::uninitialized_copy_result<ranges::borrowed_iterator_t<IR>,
                                                ranges::borrowed_iterator_t<OR>>
        operator()(IR&& in_range, OR&& out_range) const
    {
        return (*this)(ranges::begin(in_range), ranges::end(in_range),
                       ranges::begin(out_range),
                       ranges::next(ranges::begin(out_range), ranges::end(out_range)));
    }
    
    template<ranges::forward_range IR, /*nothrow-forward-range*/ OR>
        requires std::constructible_from<ranges::range_value_t<OR>,
                                         ranges::range_reference_t<IR>>
    constexpr ranges::uninitialized_copy_result<ranges::borrowed_iterator_t<IR>,
                                                ranges::borrowed_iterator_t<OR>>
        operator()(IR&& in_range, OR&& out_range) const
    {
        return (*this)(ranges::begin(in_range),
                       ranges::next(ranges::begin(in_range), ranges::end(in_range)),
                       ranges::begin(out_range),
                       ranges::next(ranges::begin(out_range), ranges::end(out_range)));
    }
};

inline constexpr uninitialized_copy_fn uninitialized_copy{};

Ejemplo

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
int main()
{
    const char* v[]{"This", "is", "an", "example"};
    if (const auto sz{std::size(v)};
        void* pbuf = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz))
    {
        try
        {
            auto first{static_cast<std::string*>(pbuf)};
            auto last{first + sz};
            std::ranges::uninitialized_copy(std::begin(v), std::end(v), first, last);
            std::cout << "{";
            for (auto it{first}; it != last; ++it)
                std::cout << (it == first ? "" : ", ") << std::quoted(*it);
            std::cout << "};\n";
            std::ranges::destroy(first, last);
        }
        catch (...)
        {
            std::cout << "uninitialized_copy exception\n";
        }
        std::free(pbuf);
    }
}

Salida:

{"This", "is", "an", "example"};

Véase también

copia un número de objetos en un área de memoria no inicializada
(objeto función de algoritmo)
copia un rango de objetos en un área de memoria no inicializada
(plantilla de función)