Namespaces
Variants

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

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, par exemple ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lot
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur les plages partitionnées)
Opérations sur les ensembles (sur les plages triées)
Opérations de fusion (sur les plages triées)
Opérations sur le tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
 
Défini dans l'en-tête <memory>
Signature d'appel
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) (depuis C++20)
(constexpr depuis 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) (depuis C++20)
(constexpr depuis 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) (depuis 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) (depuis C++26)
Types auxiliaires
template< class I, class O >
using uninitialized_copy_result = ranges::in_out_result<I, O>;
(5) (depuis C++20)

Pour la définition de /*execution-policy*/, voir cette page ; pour la définition de /*sized-random-access-range*/, voir cette page ; pour la définition des autres concepts d'exposition uniquement, voir cette page.

1) Construit des éléments dans la plage de destination [ofirstolast) à partir d'éléments dans la plage source [ifirstilast) comme si 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 pendant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.
Si [ofirstolast) chevauche [ifirstilast), le comportement est indéfini.
2) Identique à (1), mais utilise in_range comme plage source et out_range comme plage de destination.
3,4) Identique à (1,2), mais exécuté selon policy.

Les entités semblables à des fonctions décrites sur cette page sont des objets fonctions d'algorithmes (informellement appelés niebloïdes), c'est-à-dire :

Paramètres

ifirst, ilast - la paire itérateur-sentinelle définissant la plage source des éléments à copier
in_range - la plage des éléments à copier
ofirst, olast - la paire itérateur-sentinelle définissant la plage de destination des éléments
out_range - la destination plage
policy - la politique d'exécution à utiliser

Valeur de retour

Comme décrit ci-dessus.

Exceptions

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

3,4) Pendant le processus d'exécution :
  • Si les ressources mémoire temporaires nécessaires à la parallélisation ne sont pas disponibles, std::bad_alloc est levée.
  • Si une exception non interceptée est levée lors de l'accès à des objets via un argument d'algorithme, le comportement est déterminé par la politique d'exécution (pour politiques standard, std::terminate est invoqué).

Notes

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

Test de fonctionnalité macro Valeur Std Fonctionnalité
__cpp_lib_parallel_algorithm 202506L (C++26) Algorithmes de plage parallèles
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr pour spécialisés <memory> algorithmes, (1,2)

Implémentation possible

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{};

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"};

Voir aussi

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