deque c++
"Mover" dos vectores juntos (2)
Depende de exactamente lo que quiere 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á fusionar dos vectores.
Lo mejor que puedes hacer entonces es mover cada elemento miembro individual, como se muestra en la respuesta de Kerrek:
std::move(b.begin(), b.end(), std::back_inserter(a));
Nuevamente, esto se repetirá a través del vector y moverá cada elemento al vector objetivo.
Si tengo dos vectores y quiero combinarlos con uno, puedo hacerlo de la siguiente manera:
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, lo que quiero evitar. ¿Hay alguna manera de usar move-semántica para unirlos?
Lo dudo mucho, ya vector
se supone que un vector
es contiguo. Sin embargo, ¿hay alguna forma de hacerlo con un deque
?
Sí, use std::move
:
#include <algorithm>
std::move(b.begin(), b.end(), std::back_inserter(a));
Alternativamente, puede usar iteradores de 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 comenzar, diga:
a.reserve(a.size() + b.size());
Dependiendo del costo de la inicialización del valor en comparación con el control e incremento del 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);