Namespaces
Variants

std:: uninitialized_copy_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>
template < class InputIt, class Size, class NoThrowForwardIt >

NoThrowForwardIt uninitialized_copy_n ( InputIt first, Size count,

NoThrowForwardIt d_first ) ;
(1) (depuis C++11)
(constexpr depuis C++26)
template < class ExecutionPolicy, class ForwardIt,

class Size, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy_n ( ExecutionPolicy && policy,
ForwardIt first, Size count,

NoThrowForwardIt d_first ) ;
(2) (depuis C++17)
1) Copie count éléments d'une plage commençant à first vers une zone mémoire non initialisée commençant à d_first comme si par

for ( ; count > 0 ; ++ d_first, ( void ) ++ first, -- count )
:: new ( voidify ( * d_first ) )
typename std:: iterator_traits < NoThrowForwardIt > :: value_type ( * first ) ;

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)


Si d_first + [ 0 , count ) chevauche first + [ 0 , count ) , le comportement est indéfini.

(depuis C++20)

Table des matières

Paramètres

first - le début de la plage des éléments à copier
count - le nombre d'éléments à copier
d_first - le début de la plage de destination
policy - la politique d'exécution à utiliser
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
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.

Valeur de retour

Itérateur vers l'élément suivant le dernier élément copié.

Complexité

Linéaire en count .

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 InputIt, class Size, class NoThrowForwardIt>
constexpr NoThrowForwardIt uninitialized_copy_n(InputIt first, Size count,
                                                NoThrowForwardIt d_first)
{
    using T = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; count > 0; ++first, (void) ++current, --count)
            ::new (static_cast<void*>(std::addressof(*current))) T(*first);
    }
    catch (...)
    {
        for (; d_first != current; ++d_first)
            d_first->~T();
        throw;
    }
    return current;
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant (s'il y en avait) aurait été traduit en français.

Exemple

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <tuple>
#include <vector>
int main()
{
    std::vector<std::string> v = {"This", "is", "an", "example"};
    std::string* p;
    std::size_t sz;
    std::tie(p, sz) = std::get_temporary_buffer<std::string>(v.size());
    sz = std::min(sz, v.size());
    std::uninitialized_copy_n(v.begin(), sz, p);
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << ' ';
        i->~basic_string<char>();
    }
    std::cout << '\n';
    std::return_temporary_buffer(p);
}

Sortie possible :

This is an 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 tel que publié Comportement corrigé
LWG 2133 C++98 la description de l'effet utilisait une boucle for avec l'expression
d'itération ++ d_first, ++ first, -- count , ce qui
entraîne des recherches dépendantes des arguments de operator,
ignore la valeur
d'un opérande pour
désactiver ces ADL
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 une plage d'objets vers une zone mémoire non initialisée
(fonction template)
copie un nombre d'objets vers une zone mémoire non initialisée
(objet fonction algorithme)