Namespaces
Variants

std::uninitialized_fill_n

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, 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)

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

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations sur 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>
template< class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( NoThrowForwardIt first,
                                       Size count, const T& value );
(1) (constexpr depuis C++26)
template< class ExecutionPolicy,
          class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( ExecutionPolicy&& policy,
                                       NoThrowForwardIt first,
                                       Size count, const T& value );
(2) (depuis C++17)
1) Construit les premiers count éléments dans la plage de destination commençant à first avec la valeur donnée value comme si par

for (; count--; ++first)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(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 exécuté selon policy.
Cette surcharge participe à la résolution de surcharge seulement si la valeur de l'expression suivante est true:

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

(jusqu'à C++20)

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

(depuis C++20)

Paramètres

first - début de la plage des éléments à initialiser
count - nombre d'éléments à construire
value - valeur utilisée pour construire les éléments
Exigences de type
-
NoThrowForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
Aucune incrémentation, assignation, comparaison ou indirection via des instances valides de NoThrowForwardIt ne doit lever d'exceptions. L'application de & * à une valeur NoThrowForwardIt doit produire un pointeur vers son type de valeur. (jusqu'à C++11)

Valeur de retour

Comme décrit ci-dessus.

Exceptions

2) 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 attrapé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

macro Feature-test Valeur Norme Fonctionnalité
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr pour algorithmes <memory>spécialisés, (1)

Implémentation possible

template<class NoThrowForwardIt, class Size, class T>
constexpr NoThrowForwardIt uninitialized_fill_n(NoThrowForwardIt first,
                                                Size count, const T& value)
{
    using V = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; count > 0; ++current, (void) --count)
            ::new (static_cast<void*>(std::addressof(*current))) V(value);
        return current;
    }
    catch (...)
    {
        for (; first != current; ++first)
            first->~V();
        throw;
    }
    return current;
}

Exemple

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <tuple>
int main()
{
    std::string* p;
    std::size_t sz;
    std::tie(p, sz) = std::get_temporary_buffer<std::string>(4);
    std::uninitialized_fill_n(p, sz, "Example");
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    std::return_temporary_buffer(p);
}

Sortie :

Example
Example
Example
Example

Rapports de défauts

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

DR Appliqué à Comportement tel que publié Comportement correct
LWG 866 C++98 étant donné T comme type de valeur de NoThrowForwardIt, si
T::operator new existe, le programme pourrait être mal formé
utilise le placement global new à la place
LWG 1339 C++98 la position du premier élément suivant
la plage de remplissage n'a pas été retournée
retournée
LWG 2433 C++11 cet algorithme pourrait être détourné par une surcharge de operator& utilise std::addressof

Voir aussi

copie un objet vers une zone mémoire non initialisée, définie par une plage
(modèle de fonction)
copie un objet vers une zone mémoire non initialisée, définie par un début et un compte
(objet fonction algorithme)