Namespaces
Variants

std:: uninitialized_fill

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>
template < class NoThrowForwardIt, class T >

void uninitialized_fill ( NoThrowForwardIt first,

NoThrowForwardIt last, const T & value ) ;
(1) (constexpr depuis C++26)
template < class ExecutionPolicy, class NoThrowForwardIt, class T >

void uninitialized_fill ( ExecutionPolicy && policy,
NoThrowForwardIt first,

NoThrowForwardIt last, const T & value ) ;
(2) (depuis C++17)
1) Copie value vers une zone mémoire non initialisée [ first , last ) comme si par

for ( ; first ! = last ; ++ first )
:: new ( voidify ( * first ) )
typename std:: iterator_traits < NoThrowForwardIt > :: value_type ( value ) ;

Si une exception est levée durant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant la plage d'éléments à initialiser
value - la valeur avec laquelle construire les éléments
policy - la politique d'exécution à utiliser
Exigences de type
-
NoThrowForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
Aucun incrément, assignation, comparaison ou indirection via des instances valides de NoThrowForwardIt ne peut lever d'exceptions. L'application de & * à une valeur NoThrowForwardIt doit produire un pointeur vers son type de valeur. (jusqu'à C++11)

Complexité

Linéaire en fonction de la distance entre first et last .

Exceptions

La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Notes

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 )

Implémentation possible

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

Exemple

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
int main()
{
    const std::size_t sz = 4;
    std::allocator<std::string> alloc;
    std::string* p = alloc.allocate(sz);
    std::uninitialized_fill(p, p + sz, "Example");
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    alloc.deallocate(p, sz);
}

Sortie :

Example
Example
Example
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 Appliqué à Comportement publié Comportement corrigé
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 2433 C++11 cet algorithme pourrait être détourné par operator & surchargé utilise std::addressof
LWG 3870 C++20 cet algorithme pourrait créer des objets sur un stockage const maintenu interdit

Voir aussi

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