Namespaces
Variants

std::ranges:: uninitialized_fill_n

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 < no-throw-forward-range I, class T >

requires std:: constructible_from < std:: iter_value_t < I > , const T & >
I uninitialized_fill_n ( I first, std:: iter_difference_t < I > count,

const T & value ) ;
(depuis C++20)
(constexpr depuis C++26)

Copie value vers une zone mémoire non initialisée first + [ 0 , count ) comme par return ranges:: uninitialized_fill ( std:: counted_iterator ( first, count ) ,
std:: default_sentinel , value ) . base ( ) ;

Si une exception est levée pendant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.

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

Table des matières

Paramètres

first - début de la plage des éléments à initialiser
count - nombre d'éléments à construire
value - valeur avec laquelle construire les éléments

Valeur de retour

Comme décrit ci-dessus.

Complexité

Linéaire en count .

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_fill_n , par exemple en utilisant ranges::fill_n , 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

Implémentation possible

struct uninitialized_fill_n_fn
{
    template<no-throw-forward-range I, class T>
    requires std::constructible_from<std::iter_value_t<I>, const T&>
    I operator()(I first, std::iter_difference_t<I> n, const T& x) const
    {
        I rollback{first};
        try
        {
            for (; n-- > 0; ++first)
                ranges::construct_at(std::addressof(*first), x);
            return first;
        }
        catch (...) // restauration : détruire les éléments construits
        {
            for (; rollback != first; ++rollback)
                ranges::destroy_at(std::addressof(*rollback));
            throw;
        }
    }
};
inline constexpr uninitialized_fill_n_fn uninitialized_fill_n{};

Exemple

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

Sortie :

cppreference
cppreference
cppreference

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 objet vers une zone mémoire non initialisée, définie par une plage
(objet fonction algorithme)
copie un objet vers une zone mémoire non initialisée, définie par un début et un compte
(fonction template)