Namespaces
Variants

std:: uninitialized_copy

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 NoThrowForwardIt >

NoThrowForwardIt uninitialized_copy ( InputIt first, InputIt last,

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

class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy ( ExecutionPolicy && policy,
ForwardIt first, ForwardIt last,

NoThrowForwardIt d_first ) ;
(2) (depuis C++17)
1) Copie les éléments de la plage [ first , last ) vers une zone mémoire non initialisée commençant à d_first comme si par

for ( ; first ! = last ; ++ d_first, ( void ) ++ first )
:: 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 , std:: distance ( first, last ) ) chevauche [ first , last ) , le comportement est indéfini.

(depuis C++20)

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle des éléments à copier
d_first - le début de l'intervalle 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. L'application de & * à une valeur NoThrowForwardIt doit produire un pointeur vers son type de valeur. (jusqu'en C++11)

Valeur de retour

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

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ée. 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ée.

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 NoThrowForwardIt>
constexpr NoThrowForwardIt uninitialized_copy(InputIt first, InputIt last,
                                              NoThrowForwardIt d_first)
{
    using T = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; first != last; ++first, (void) ++current)
            ::new (static_cast<void*>(std::addressof(*current))) T(*first);
        return current;
    }
    catch (...)
    {
        for (; d_first != current; ++d_first)
            d_first->~T();
        throw;
    }
}

Exemple

#include <cstdlib>
#include <iostream>
#include <memory>
#include <string>
int main()
{
    const char *v[] = {"This", "is", "an", "example"};
    auto sz = std::size(v);
    if (void *pbuf = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz))
    {
        try
        {
            auto first = static_cast<std::string*>(pbuf);
            auto last = std::uninitialized_copy(std::begin(v), std::end(v), first);
            for (auto it = first; it != last; ++it)
                std::cout << *it << '_';
            std::cout << '\n';
            std::destroy(first, last);
        }
        catch (...) {}
        std::free(pbuf);
    }
}

Sortie :

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 Applicable à 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 remplacement global
de new à la place
LWG 2133 C++98 la description de l'effet utilisait une boucle for avec l'expression
d'itération ++ d_first, ++ first , ce qui entraîne
une recherche dépendante des arguments de operator,
ignore la valeur
d'un opérande
pour désactiver cette ADL
LWG 2433 C++11 cet algorithme pourrait être détourné par une surcharge de operator & utilise std::addressof
LWG 3870 C++20 cet algorithme pourrait créer des objets sur un stockage const maintenu interdit

Voir aussi

copie un nombre d'objets vers une zone mémoire non initialisée
(fonction template)
copie une plage d'objets vers une zone mémoire non initialisée
(objet fonction algorithme)