Namespaces
Variants

std::move

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenación y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last,
               OutputIt d_first );
(1) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 move( ExecutionPolicy&& policy,
                 ForwardIt1 first, ForwardIt1 last,
                 ForwardIt2 d_first );
(2) (desde C++17)
1) Mueve los elementos del rango [first, last), a otro rango que comienza en d_first, comenzando desde first y procediendo hasta last. Después de esta operación, los elementos en el rango de origen seguirán conteniendo valores válidos del tipo apropiado, pero no necesariamente los mismos valores que antes del movimiento.
2) Igual que (1), pero ejecutado según policy.
Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

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

(hasta C++20)

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

(desde C++20)

Si d_first está dentro del rango [first, last), el comportamiento no está definido. En este caso, se puede usar std::move_backward en su lugar.

Parámetros

first, last - el par de iteradores que definen el rango de origen de elementos a mover
d_first - el inicio del rango de destino
policy - la política de ejecución a utilizar
Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
OutputIt debe cumplir los requisitos de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 debe cumplir los requisitos de LegacyForwardIterator.

Valor de retorno

El iterador al elemento siguiente al último elemento movido.

Complejidad

Exactamente std::distance(first, last) asignaciones de movimiento.

Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy reporta errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementación

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;
}

Notas

Cuando se mueven rangos superpuestos, std::move es apropiado al mover hacia la izquierda (el inicio del rango de destino está fuera del rango de origen) mientras que std::move_backward es apropiado al mover hacia la derecha (el final del rango de destino está fuera del rango de origen).

Ejemplo

El siguiente código mueve objetos thread (que en sí mismos no son copiables) de un contenedor a otro.

#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));
}

Salida:

thread 1 ended
thread 2 ended
thread 3 ended

Véase también

mueve un rango de elementos a una nueva ubicación en orden inverso
(plantilla de función & objeto función de algoritmo)
(C++11)
convierte el argumento en un xvalue
(plantilla de función)
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo)