2010-01-16 13 views
5

En C++ 98, puedo copiar rangos con el algoritmo std::copy.¿Hay algún algoritmo para mover rangos?

std::copy(source.begin(), source.end(), destination.begin()); 

¿Hay algún algoritmo en C++ 0x que mueva los elementos del origen al destino? ¿O es std::copy de alguna manera sobrecargado para aceptar algo como iteradores rvalue? ¿Existe tal cosa?

El algoritmo podría ser algo como esto:

#include <utility> 

template<class InputIterator, class OutputIterator> 
OutputIterator mooove(InputIterator first, InputIterator last, OutputIterator result) 
{ 
    for (; first != last; ++first, ++last) *result = std::move(*first); 
    return result; 
} 
+0

¿Qué quiere decir con "mover"? –

+0

Invocando la asignación de movimiento 'operator = (T &&)' en lugar de la asignación de copia 'operator = (const T &)' para cada elemento del rango. – fredoverflow

+0

para que el algoritmo altere el rango de fuente, en lugar de copiar, ¿'cortará' los elementos? –

Respuesta

5

Parece estar en el latest draft (ver sección 25.3.2).

Tengo una copia impresa de C++ 03 que es exactamente lo mismo que C++98 (secciones 25.2.x) donde se pueden ver los mismos algoritmos (sin 'movimiento' obviamente).

+0

Ah, lo encontré, gracias. En realidad es 25.3.2;) – fredoverflow

0

El hecho de que esta página es un lil confuso en este momento ... Hay un std::move(first, last, dest), OP se confundió al mirar un borrador anterior de C++ 0x. La función está definida por la sección 25.3.2.

2

También hay un adaptador de iterador, std::move_iterator, que se puede usar para adaptar cualquier algoritmo de rango que haga copias para mover los elementos en su lugar. std::move(first, last, dest) es solo una envoltura de conveniencia para el caso de uso más común - es semánticamente equivalente a std::copy(std::move_iterator(first), std::move_iterator(last), dest).

+0

Ah, entonces sí existe algo así como un "iterador rvalue" :) – fredoverflow

Cuestiones relacionadas