Namespaces
Variants

std::uninitialized_copy

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de modificación de secuencias
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 ordenamiento y relacionadas
Operaciones de particionamiento
(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>
template< class InputIt, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy( InputIt first, InputIt last,
                                     NoThrowForwardIt d_first );
(1) (constexpr desde C++26)
template< class ExecutionPolicy, class ForwardIt,
          class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy( ExecutionPolicy&& policy,
                                     ForwardIt first, ForwardIt last,
                                     NoThrowForwardIt d_first );
(2) (desde C++17)
1) Construye elementos en el rango de destino comenzando en d_first a partir de elementos en el rango de origen [first, last) como si por

for (; first != last; ++d_first, (void) ++first)
    ::new (voidify(*d_first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(*first);
return d_first;

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.
Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)


Si d_first + [0, std::distance(first, last)) se superpone con [first, last), el comportamiento no está definido.

(desde C++20)

Parámetros

first, last - el par de iteradores que define el rango de elementos a copiar
d_first - el inicio del rango de destino
policy - la política de ejecución a utilizar
Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .
-
ForwardIt debe cumplir con los requisitos de LegacyForwardIterator .
-
NoThrowForwardIt debe cumplir con los requisitos de LegacyForwardIterator .
-
Ningún incremento, asignación, comparación o indirección a través de instancias válidas de NoThrowForwardIt puede lanzar excepciones. Aplicar & * a un valor de NoThrowForwardIt debe producir un puntero a su tipo de valor. (hasta C++11)

Valor de retorno

Como se ha descrito anteriormente.

Excepciones

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 al acceder a objetos a través de un argumento de algoritmo, el comportamiento está determinado por la política de ejecución (para políticas estándar, std::terminate es invocado).

Notas

Prueba de característica macro Valor Std Característica
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr para especializados <memory> algoritmos, (1)

Implementación posible

template<class InputIt, class NoThrowForwardIt>
constexpr NoThrowForwardIt uninitialized_copy(InputIt first, InputIt last,
                                              NoThrowForwardIt d_first)
{
    using T = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; first != last; ++first, (void) ++current)
            ::new (static_cast<void*>(std::addressof(*current))) T(*first);
        return current;
    }
    catch (...)
    {
        for (; d_first != current; ++d_first)
            d_first->~T();
        throw;
    }
}

Ejemplo

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

Salida:

This_is_an_example_

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 866 C++98 dado T como el tipo de valor de NoThrowForwardIt, si
T::operator new existe, el programa podría estar mal formado
utiliza el nuevo reemplazo global-
new en su lugar
LWG 2133 C++98 la descripción del efecto utilizaba un for bucle con la expresión de iteración
++d_first, ++first, lo que resulta
en una búsqueda dependiente de argumentos de operator,
descarta el valor
de un operando
para deshabilitar esa ADL
LWG 2433 C++11 este algoritmo podría ser secuestrado por una sobrecarga de operator& utiliza std::addressof

Véase también

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