Namespaces
Variants

std::ranges::uninitialized_fill

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(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)

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

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations ensemblistes (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de 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< /*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S,
          class T >
    requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( I first, S last, const T& value );
(1) (depuis C++20)
(constexpr depuis C++26)
template< /*nothrow-forward-range*/ R, class T >
    requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( R&& r,
                                                   const T& value );
(2) (depuis C++20)
(constexpr depuis C++26)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I,
          /*nothrow-sized-sentinel-for*/<I> S,
          class T = std::iter_value_t<I> >
    requires constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( Ep&& policy, I first, S last, const T& value );
(3) (depuis C++26)
template< /*execution-policy*/ Ep, /*nothrow-sized-random-access-range*/ R,
          class T = ranges::range_value_t<R> >
    requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( Ep&& policy, R&& r,
                                                   const T& value );
(4) (depuis C++26)

Pour la définition de /*execution-policy*/, 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 [firstlast) avec la valeur donnée value comme par

for (; first != last; ++first)
    ::new (voidify(*first)) std::remove_reference_t<std::iter_reference_t<I>>(value);
return first;

Si une exception est levée lors de l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.
2) Identique à (1), mais utilise r comme plage de destination.
3,4) Identique à (1,2), mais exécuté selon policy.

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

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage d'éléments à initialiser
r - la plage des éléments à initialiser
value - la valeur avec laquelle construire les éléments
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 aux objets via un argument d'algorithme, le comportement est déterminé par la politique d'exécution (pour politiques standard, std::terminate est invoquée).

Remarques

Une implémentation peut améliorer l'efficacité de ranges::uninitialized_fill (en utilisant par ex. ranges::fill) si le type de valeur du domaine 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_fill_fn
{
    template</*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S, class T>
        requires std::constructible_from<std::iter_value_t<I>, const T&>
    constexpr I operator()(I first, S last, const T& value) const
    {
        I rollback{first};
        try
        {
            for (; !(first == last); ++first)
                ranges::construct_at(std::addressof(*first), value);
            return first;
        }
        catch (...)
        {   
            // rollback: destroy constructed elements
            for (; rollback != first; ++rollback)
                ranges::destroy_at(std::addressof(*rollback));
            throw;
        }
    }

    template</*nothrow-forward-range*/ R, class T>
        requires std::constructible_from<ranges::range_value_t<R>, const T&>
    constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, const T& value) const
    {
        return (*this)(ranges::begin(r),
                       ranges::next(ranges::begin(r), ranges::end(r)), value);
    }
};

inline constexpr uninitialized_fill_fn uninitialized_fill{};

Exemple

#include <iostream>
#include <memory>
#include <string>
int main()
{
    constexpr int n{4};
    alignas(alignof(std::string)) char out[n * sizeof(std::string)];
    try
    {
        auto first{reinterpret_cast<std::string*>(out)};
        auto last{first + n};
        std::ranges::uninitialized_fill(first, last, "▄▀▄▀▄▀▄▀");
        int count{1};
        for (auto it{first}; it != last; ++it)
            std::cout << count++ << ' ' << *it << '\n';
        std::ranges::destroy(first, last);
    }
    catch(...)
    {
        std::cout << "Exception!\n";
    }
}

Sortie :

1 ▄▀▄▀▄▀▄▀
2 ▄▀▄▀▄▀▄▀
3 ▄▀▄▀▄▀▄▀
4 ▄▀▄▀▄▀▄▀

Voir aussi

copie un objet dans une zone mémoire non initialisée, définie par un début et un compte
(objet fonction d'algorithme)
copie un objet dans une zone mémoire non initialisée, définie par une plage
(gabarit de fonction)