c++ vector c++11 move deque

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);