std:: move
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
InputIt,
class
OutputIt
>
OutputIt move
(
InputIt first, InputIt last,
|
(1) |
(desde C++11)
(constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt2 move
(
ExecutionPolicy
&&
policy,
|
(2) | (desde C++17) |
[
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.
|
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
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, 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
|
(C++11)
|
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) |
|
(C++20)
|
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo) |