Moving elements from std::vector to another one
std::move
and std::copy
operate on elements, not containers. You have to mutate the container separately. For example, to move the first 17 elements of v1
into a new vector v2
:
std::vector<Foo> v1, v2;
// populate v1 with at least 17 elements...
auto it = std::next(v1.begin(), 17);
std::move(v1.begin(), it, std::back_inserter(v2)); // ##
v1.erase(v1.begin(), it);
After line ##
, the first 17 elements of v1
are still there, but they've been "moved-from", so they're in an indeterminate state.
Resurrecting an old thread, but I am surprised that nobody mentioned std::make_move_iterator
combined with insert
. It has the important performance benefit of preallocating space in the target vector:
v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7),
std::make_move_iterator(v1.end()));
As others have pointed out, first vector v1
is now in indeterminate state, so use erase
to clear the mess:
v1.erase(v1.begin() + 7, v1.end());
The std::move
lets you move the objects, as opposed to copying them, allowing for a potentially faster execution speed. The savings may be even greater when you move a range of values. However, when you do move a range from a container, the container still holds the places that were once occupied by these values.
You need to resize the container manually to remove these placeholders if you want to get rid of them (you don't have to, in case you would prefer reusing these container spots for other elements). One way to do it is to call vector::erase
on the same range that you moved out of the container.