2012-03-19 13 views
25

Si tengo dos vectores y quiero combinarlos a uno, puede hacerlo de la siguiente manera:"mover" dos vectores juntos

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

Eso implica copiar sin embargo, que quiero evitar. ¿Hay alguna manera de usar move-semántica para unirlos?
Lo dudo mucho, ya que se supone que un vector es contiguo. Sin embargo, ¿hay alguna manera de hacerlo con un deque?

Respuesta

48

Sí, utilizar std::move:

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

Como alternativa, puede usar iteradores movimiento:

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

Recuerde #include <iterator> en ambos casos, y antes de empezar, decir:

a.reserve(a.size() + b.size()); 

Según el costo de la inicialización del valor en comparación con la comprobación y el incremento En el contador de tamaño, la siguiente variante también puede ser interesante:

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

Gracias, ahora sé por qué hay dos versiones de 'std :: move' en cppreference. Siempre pensé que era un error y no revisé la segunda versión. – inf

+3

Me había perdido completamente ese 'movimiento 'también era un algoritmo. – bames53

+0

@ bames53 me pasó lo mismo, pero después de escucharlo, tiene mucho sentido ya que también hay 'copia'. – inf

7

Depende exactamente de lo que desea mover. Cuando mueves un vector, se hace intercambiando efectivamente el puntero del arreglo interno. Así que puedes hacer que un vector señale la matriz que anteriormente pertenecía a otro vector.

Pero eso no le permitirá combinar dos vectores.

Lo mejor que puede hacer entonces es mover todos los elementos miembro individual, como se muestra en la respuesta de kerrek:

std::move(b.begin(), b.end(), std::back_inserter(a)); 

De nuevo, esto se repetirá a través del vector y mover todos los elementos al vector objetivo.

+0

Una pregunta, ¿qué diferencia hace? ¿No estamos esencialmente copiando los objetos en a en las posiciones en b? ¿No hará lo mismo que insertar como en la pregunta de la operación? – nnrales

+0

Supongo que si los objetos en a son complejos, entonces no se invocarán sus copiadores, solo una copia de memoria. – nnrales

Cuestiones relacionadas