Namespaces
Variants

std::ranges::uninitialized_default_construct_n

Depuis 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 d'ensemble (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 >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_default_construct_n( I first,
                                     std::iter_difference_t<I> count );
(1) (depuis C++20)
(constexpr depuis C++26)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_default_construct_n( Ep&& policy, I first,
                                     std::iter_difference_t<I> count );
(2) (depuis C++26)

Pour la définition de /*execution-policy*/, voir cette page; pour la définition d'autres concepts d'exposition seulement, voir cette page.

1) Construit des éléments dans la plage de destination first + [0count) par initialisation par défaut comme si par

return ranges::uninitialized_default_construct(std::counted_iterator(first, count),
                                               std::default_sentinel).base();

Si une exception est levée pendant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.
2) Identique à (1), mais exécuté selon policy.

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

Paramètres

first - le début de la plage d'éléments à initialiser
count - le nombre d'éléments à construire
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.

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 capturé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 les politiques standard, std::terminate est invoquée).

Remarques

Une implémentation peut ignorer la construction de l'objet (sans changer l'effet observable) si aucun constructeur par défaut non trivial n'est appelé lors de l'initialisation par défaut d'un objet std::iter_value_t<I>, ce qui peut être détecté par std::is_trivially_default_constructible.

test de fonctionnalité macro Valeur Norme 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)

Implémentation possible

struct uninitialized_default_construct_n_fn
{
    template</*nothrow-forward-iterator*/ I>
        requires std::default_initializable<std::iter_value_t<I>>
    constexpr I operator()(I first, std::iter_difference_t<I> count) const
    {
        auto iter = std::counted_iterator(first, count);
        return ranges::uninitialized_default_construct(iter, std::default_sentinel).base();
    }
};

inline constexpr uninitialized_default_construct_n_fn uninitialized_default_construct_n{};

Exemple

#include <cstring>
#include <iostream>
#include <memory>
#include <string>

int main()
{
    struct S { std::string m{"█▓▒░ █▓▒░ "}; };
    
    constexpr int n{4};
    alignas(alignof(S)) char out[n * sizeof(S)];
    
    try
    {
        auto first{reinterpret_cast<S*>(out)};
        auto last = std::ranges::uninitialized_default_construct_n(first, n);
        
        auto count{1};
        for (auto it{first}; it != last; ++it)
            std::cout << count++ << ' ' << it->m << '\n';
        
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
    
    // For scalar types, uninitialized_default_construct_n
    // generally does not zero-fill the given uninitialized memory area.
    constexpr int sample[]{1, 2, 3, 4, 5, 6};
    int v[]{1, 2, 3, 4, 5, 6};
    std::ranges::uninitialized_default_construct_n(std::begin(v), std::size(v));
    if (std::memcmp(v, sample, sizeof(v)) == 0)
    {
        // Maybe undefined behavior, pending CWG 1997:
        // for (const int i : v) { std::cout << i << ' '; }
        for (const int i : sample)
            std::cout << i << ' ';
    }
    else
        std::cout << "Unspecified!";
    std::cout << '\n';
}

Résultat possible :

1 █▓▒░ █▓▒░
2 █▓▒░ █▓▒░
3 █▓▒░ █▓▒░
4 █▓▒░ █▓▒░
1 2 3 4 5 6

Voir aussi

construit des objets par initialisation par défaut dans une zone mémoire non initialisée, définie par une plage
(objet fonction d'algorithme)
construit des objets par initialisation par valeur dans une zone mémoire non initialisée, définie par une plage
(objet fonction d'algorithme)
construit des objets par initialisation par valeur dans une zone mémoire non initialisée, définie par un début et un nombre
(objet fonction d'algorithme)
construit des objets par initialisation par défaut dans une zone mémoire non initialisée, définie par un début et un nombre
(modèle de fonction)