merge(iterator, iterator, iterator2, iterator2, outIterator)
должен взять 5 итераторов, разделить отправленный вектор, затем отсортировать 2 отдельных вектора, а затем объединить их в один отсортированный вектор. Кажется, мой метод работает, если range2
не имеет элементов меньше range1
, которые затем не пройдут мой тест.
template<typename Iter1, typename Iter2, typename OIter>
OIter merge(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2, OIter out) {
// TODO
auto i = first1;
auto j = first2;
while (j != last2 && i != last1) {
if (first2 == last2) {
return std::copy(first1, last1, out);
}
if (*i < *j) {
*out++ = *i++;
} else {
*out++ = *j++;
}
}
//only one of the ranges has elements copy them over
if (first2 == last2) {
return std::copy(first1, last1, out);
} else {
return std::copy(first2, last2, out);
}
}
TEST:
REQUIRE( out == copy_out )
с расширением:
{ 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0 } = actual
==
{ 0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } = expected