Namespaces
Variants

std::ranges:: uninitialized_move_n, std::ranges:: uninitialized_move_n_result

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>
Signature d'appel
template < std:: input_iterator I,

no-throw-forward-iterator O, no - throw - sentinel - for < O > S >
requires std:: constructible_from < std:: iter_value_t < O > ,
std:: iter_rvalue_reference_t < I >>
uninitialized_move_n_result < I, O >
uninitialized_move_n ( I ifirst, std:: iter_difference_t < I > count,

O ofirst, S olast ) ;
(1) (depuis C++20)
(constexpr depuis C++26)
Types auxiliaires
template < class I, class O >
using uninitialized_move_n_result = ranges:: in_out_result < I, O > ;
(2) (depuis C++20)

Soit N la valeur de ranges:: min ( count, ranges:: distance ( ofirst, olast ) ) .

Copie N éléments de la plage commençant à ifirst (en utilisant la sémantique de déplacement si supportée) vers une zone mémoire non initialisée [ ofirst , olast ) comme par auto ret = ranges:: uninitialized_move ( std:: counted_iterator ( std :: move ( ifirst ) , count ) ,
std:: default_sentinel , ofirst, olast ) ;
return { std :: move ( ret. in ) . base ( ) , ret. out } ;

Si une exception est levée pendant l'initialisation, les objets déjà construits dans [ ofirst , olast ) sont détruits dans un ordre non spécifié. De plus, les objets dans la plage d'entrée commençant à ifirst , qui ont déjà été déplacés, sont laissés dans un état valide mais non spécifié.

Si [ ofirst , olast ) chevauche ifirst + [ 0 , count ) , le comportement est indéfini.

Les entités de type fonction décrites sur cette page sont des algorithm function objects (informellement appelées niebloids ), c'est-à-dire :

Table des matières

Paramètres

ifirst - le début de la plage d'entrée des éléments à déplacer
ofirst, olast - la paire itérateur-sentinelle définissant la plage de sortie des éléments à initialiser
n - le nombre d'éléments à déplacer

Valeur de retour

Comme décrit ci-dessus.

Complexité

𝓞(N) .

Exceptions

Toute exception levée lors de la construction des éléments dans la plage de destination.

Notes

Une implémentation peut améliorer l'efficacité de ranges::uninitialized_move_n , par exemple en utilisant ranges::copy_n , si le type de valeur de la plage de sortie est TrivialType .

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

struct uninitialized_move_n_fn
{
    template<std::input_iterator I,
             no-throw-forward-iterator O, no-throw-sentinel-for<O> S>
        requires std::constructible_from<std::iter_value_t<O>,
                                         std::iter_rvalue_reference_t<I>>
    constexpr ranges::uninitialized_move_n_result<I, O>
        operator()(I ifirst, std::iter_difference_t<I> count, O ofirst, S olast) const
    {
        auto iter = std::counted_iterator(std::move(ifirst), count);
        auto ret = ranges::uninitialized_move(iter, std::default_sentinel, ofirst, olast);
        return {std::move(ret.in).base(), ret.out};
    }
};
inline constexpr uninitialized_move_n_fn uninitialized_move_n{};

Exemple

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
void print(auto rem, auto first, auto last)
{
    for (std::cout << rem; first != last; ++first)
        std::cout << std::quoted(*first) << ' ';
    std::cout << '\n';
}
int main()
{
    std::string in[]{ "No", "Diagnostic", "Required", };
    print("initially, in: ", std::begin(in), std::end(in));
    if (
        constexpr auto sz = std::size(in);
        void* out = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz)
    )
    {
        try
        {
            auto first{static_cast<std::string*>(out)};
            auto last{first + sz};
            std::ranges::uninitialized_move_n(std::begin(in), sz, first, last);
            print("after move, in: ", std::begin(in), std::end(in));
            print("after move, out: ", first, last);
            std::ranges::destroy(first, last);
        }
        catch (...)
        {
            std::cout << "Exception!\n";
        }
        std::free(out);
    }
}

Sortie possible :

initially, in: "No" "Diagnostic" "Required"
after move, in: "" "" ""
after move, out: "No" "Diagnostic" "Required"

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 3870 C++20 cet algorithme pourrait créer des objets sur un const stockage maintenu interdit

Voir aussi

déplace une plage d'objets vers une zone mémoire non initialisée
(objet fonction algorithme)
déplace un nombre d'objets vers une zone mémoire non initialisée
(modèle de fonction)