std::vector::insert() accepts a range of iterators:
std::vector<int> left(fn(data1)); std::vector<int> right(fn(data2)); data.insert(data.end(), left.begin(), left.end()); data.push_back(mid); data.insert(data.end(), right.begin(), right.end()); return data;
You can also use std::copy() from <algorithm> and std::back_inserter() from <iterator> :
std::copy(left.begin(), left.end(), std::back_inserter(data)); data.push_back(mid); std::copy(right.begin(), right.end(), std::back_inserter(data));
However, insert() can know in advance the size of its input range and reserve() corresponding amount of memory, and back_insert_iterator opaque - it simply calls push_back() again. They both work in linear time, but insert() is likely to make fewer allocations.
If the elements of your vectors are more efficient for moving than for copying, you can use C ++ 11 std::make_move_iterator() from <iterator> to adapt the input ranges:
data.insert(data.end(), std::make_move_iterator(left.begin()), std::make_move_iterator(left.end())); data.push_back(mid); data.insert(data.end(), std::make_move_iterator(right.begin()), std::make_move_iterator(right.end()));
Although I doubt that this would affect the int .
source share