#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
template<typename I>
void doMerge(I begin, I midPoint, I end)
{
typedef std::vector<typename std::iterator_traits<I>::value_type> TmpVec;
TmpVec tmp(std::make_move_iterator(begin), std::make_move_iterator(end));
TmpVec::iterator beginAlt = std::begin(tmp);
TmpVec::iterator endAlt = std::end(tmp);
TmpVec::iterator midAlt = std::next(beginAlt, std::distance(begin, midPoint));
TmpVec::iterator l = beginAlt;
TmpVec::iterator r = midAlt;
I i = begin;
while(l < midAlt && r < endAlt)
{
*i = std::move((*l < *r) ? *l++ : *r++);
++i;
}
while(l < midAlt)
{ *i = std::move(*l++);
++i;
}
while(r < endAlt)
{ *i = std::move(*r++);
++i;
}
}
template<typename I>
void mergeSort(I begin, I end)
{
std::size_t length = std::distance(begin, end);
if (length <= 1)
{ return;
}
std::size_t mid = length/2;
I midPoint = std::next(begin, mid); // ++
mergeSort(begin, midPoint);
mergeSort(midPoint, end);
doMerge(begin, midPoint, end);
}
int main()
{
int arr[] = {5,12,45,2,67,8};
size_t count=sizeof(arr)/sizeof(int);
std::vector<int> data(arr, arr+count);
mergeSort(std::begin(data), std::end(data));
std::copy(std::begin(data), std::end(data), std::ostream_iterator<int>(std::cout, ", "));
std::cout << "\n";
}