If I have two vectors and want to combine them to one, I can do it the following way:
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));
That involves copying though, which I want to avoid. Is there any way to use move-semantics to get them together?
I highly doubt it, as a vector
is supposed to be contiguous. However is there any way to do it with a deque
?
Yes, use std::move
:
#include <algorithm>
std::move(b.begin(), b.end(), std::back_inserter(a));
Alternatively, you can use move iterators:
a.insert(a.end(),
std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));
Remember to #include <iterator>
in both cases, and before you begin, say:
a.reserve(a.size() + b.size());
Depending on the cost of value-initialization compared to checking and incrementing the size counter, the following variant may also be interesting:
std::size_t n = a.size();
a.resize(a.size() + b.size());
std::move(b.begin(), b.end(), a.begin() + n);