Namespaces
Variants

std:: move

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
move
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
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 en el 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 de acuerdo con la policy .
Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(hasta C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(desde C++20)

Si d_first se encuentra dentro del rango [ first , last ) , el comportamiento es indefinido. En este caso, puede utilizarse std::move_backward en su lugar.

Contenidos

Parámetros

first, last - el par de iteradores que define el rango fuente 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 con los requisitos de LegacyInputIterator .
-
OutputIt debe cumplir con los requisitos de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2 debe cumplir con los requisitos de LegacyForwardIterator .

Valor de retorno

El iterador al elemento después del ú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 uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

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

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

Ejemplo

El siguiente código mueve objetos de hilo (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)
(C++11)
convierte el argumento a un xvalue
(plantilla de función)
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo)