Namespaces
Variants

std::move

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, p. 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 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 <algorithm>
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last,
               OutputIt d_first );
(1) (depuis C++11)
(constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 move( ExecutionPolicy&& policy,
                 ForwardIt1 first, ForwardIt1 last,
                 ForwardIt2 d_first );
(2) (depuis C++17)
1) Déplace les éléments dans la plage [firstlast), vers une autre plage commençant à d_first, en commençant par le premier et en progressant jusqu'à last. Après cette opération, les éléments dans la plage d'origine contiendront toujours des valeurs valides du type approprié, mais pas nécessairement les mêmes valeurs qu'avant le déplacement.
2) Identique à (1), mais exécutée selon policy.
Cette surcharge participe à la résolution de surcharge uniquement si la valeur de l'expression suivante est true :

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(depuis C++20)

Si d_first se trouve dans la plage [firstlast), le comportement est indéfini. Dans ce cas, std::move_backward peut être utilisé à la place.

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à déplacer
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.
-
OutputIt doit satisfaire aux exigences de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 doit satisfaire aux exigences de LegacyForwardIterator.

Valeur de retour

L'itérateur pointant sur l'élément suivant le dernier élément déplacé.

Complexité

Exactement std::distance(first, last) affectations par déplacement.

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 est l'une des politiques standard, std::terminate est appelé. Pour tout autre ExecutionPolicy, le comportement est défini par l'implémentation.
  • Si l'algorithme échoue à allouer de la mémoire, std::bad_alloc est levée.

Implémentation possible

template<class InputIt, class OutputIt>
OutputIt move(InputIt first, InputIt last, OutputIt d_first)
{
    for (; first != last; ++d_first, ++first)
        *d_first = std::move(*first);
    
    return d_first;
}

Notes

Lors du déplacement de plages qui se chevauchent, std::move est approprié pour déplacer vers la gauche (le début de la plage de destination est en dehors de la plage source) tandis que std::move_backward est approprié pour déplacer vers la droite (la fin de la plage de destination est en dehors de la plage source).

Exemple

Le code suivant déplace des objets thread (qui ne sont pas copiables eux-mêmes) d'un conteneur à un autre.

#include <algorithm>
#include <chrono>
#include <iostream>
#include <iterator>
#include <list>
#include <thread>
#include <vector>

void f(int n)
{
    std::this_thread::sleep_for(std::chrono::seconds(n));
    std::cout << "thread " << n << " ended" << std::endl;
}

int main()
{
    std::vector<std::jthread> v;
    v.emplace_back(f, 1);
    v.emplace_back(f, 2);
    v.emplace_back(f, 3);
    std::list<std::jthread> l;
    
    // copy() would not compile, because std::jthread is noncopyable
    std::move(v.begin(), v.end(), std::back_inserter(l));
}

Sortie :

thread 1 ended
thread 2 ended
thread 3 ended

Voir aussi

déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse
(modèle de fonction & objet fonction d'algorithme)
(C++11)
convertit l'argument en une xvalue
(modèle de fonction)
déplace une plage d'éléments vers un nouvel emplacement
(objet fonction d'algorithme)