Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Défini dans l'en-tête <memory>
Signature d'appel
template < std:: input_iterator I, std:: sentinel_for < I > S1,

no-throw-forward-iterator O, no - throw - 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) (depuis C++20)
(constexpr depuis C++26)
template < ranges:: input_range IR, no-throw-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) (depuis C++20)
(constexpr depuis C++26)
Types auxiliaires
template < class I, class O >
using uninitialized_copy_result = ranges:: in_out_result < I, O > ;
(3) (depuis C++20)

Soit N égal à ranges:: min ( ranges:: distance ( ifirst, ilast ) , ranges:: distance ( ofirst, olast ) ) .

1) Construit N éléments à partir de la plage [ ifirst , ilast ) vers une zone mémoire non initialisée [ ofirst , olast ) comme par

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 une exception est levée durant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.
Si [ ofirst , olast ) chevauche [ ifirst , ilast ) , le comportement est indéfini.
2) Équivalent à return ranges :: uninitialized_copy ( ranges:: begin ( in_range ) , ranges:: end ( in_range ) ,
ranges:: begin ( out_range ) , ranges:: end ( out_range ) ) ;
.

Les entités de type fonction décrites sur cette page sont des algorithm function objects (informellement appelées niebloids ), c'est-à-dire :

Table des matières

Paramètres

ifirst, ilast - la paire itérateur-sentinelle définissant la plage source des éléments à copier
in_range - la range des éléments à copier
ofirst, olast - la paire itérateur-sentinelle définissant la plage destination des éléments
out_range - la range destination

Valeur de retour

Comme décrit ci-dessus.

Complexité

𝓞(N) .

Exceptions

Toute exception levée lors de la construction des éléments dans la plage de destination.

Notes

Une implémentation peut améliorer l'efficacité de ranges::uninitialized_copy si le type de valeur de la plage de sortie est TrivialType .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr pour les algorithmes de mémoire spécialisés , ( 1,2 )

Implémentation possible

struct uninitialized_copy_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S1,
             no-throw-forward-iterator O, no-throw-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 (...) // restauration : détruire les éléments construits
        {
            for (; ofirst != current; ++ofirst)
                ranges::destroy_at(std::addressof(*ofirst));
            throw;
        }
    }
    template<ranges::input_range IR, no-throw-forward-range OR>
        requires std::constructible_from<ranges::range_value_t<OR>,
    constexpr ranges::range_reference_t<IR>>
        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::end(out_range));
    }
};
inline constexpr uninitialized_copy_fn uninitialized_copy{};

Exemple

#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);
    }
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3870 C++20 cet algorithme pourrait créer des objets sur un const stockage maintenu interdit

Voir aussi

copie un nombre d'objets vers une zone mémoire non initialisée
(objet fonction algorithme)
copie une plage d'objets vers une zone mémoire non initialisée
(modèle de fonction)