Search code examples
c++c++11vectormove-semanticsdeque

"move" two vectors together


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?


Solution

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