Namespaces
Variants

std::ranges::uninitialized_value_construct_n

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les vues (C++20)
Algorithmes contraints, ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
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 connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des 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_value_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_value_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 des autres concepts d'exposition uniquement, voir cette page.

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

return ranges::uninitialized_value_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 des objets fonctions d'algorithmes (informellement appelés niebloids), c'est-à-dire :

Paramètres

premier - le début de la plage d'éléments à initialiser
nombre - le nombre d'éléments à construire
politique - 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 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 les politiques standard, std::terminate est invoquée).

Notes

Une implémentation peut améliorer l'efficacité de ranges::uninitialized_value_construct_n (en utilisant par exemple ranges::fill_n) si le type de valeur de la plage est un CopyAssignable TrivialType.

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_value_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_value_construct(iter, std::default_sentinel).base();
    }
};

inline constexpr uninitialized_value_construct_n_fn uninitialized_value_construct_n{};

Exemple

#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_value_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";
    }
    // Pour les types scalaires, uninitialized_value_construct_n
    // initialise à zéro la zone mémoire non initialisée donnée.
    int v[]{1, 2, 3, 4, 5, 6, 7, 8};
    std::cout << ' ';
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << "\n ";
    std::ranges::uninitialized_value_construct_n(std::begin(v), std::size(v));
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}

Sortie :

1 █▓▒░ █▓▒░ █▓▒░ 
2 █▓▒░ █▓▒░ █▓▒░ 
3 █▓▒░ █▓▒░ █▓▒░ 
4 █▓▒░ █▓▒░ █▓▒░
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0

Voir aussi

construit des objets par initialisation par valeur dans une zone mémoire non initialisée, définie par une plage
(objet fonction algorithme)
construit des objets par initialisation par défaut dans une zone mémoire non initialisée, définie par une plage
(objet fonction 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 compte
(objet fonction algorithme)
construit des objets par initialisation par valeur dans une zone mémoire non initialisée, définie par un début et un compte
(modèle de fonction)