Функция слияния неправильно копирует в вектор - PullRequest
1 голос
/ 23 апреля 2020

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

1 Ответ

1 голос
/ 23 апреля 2020

Этот лог c неверен

//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);
}

он должен быть

//only one of the ranges has elements left, copy them over
if(j == last2)
{
  return std::copy(i, last1, out);
}else{
  return std::copy(j, last2, out);
}

Также этот специальный метод

if(first2 == last2)
{
  return std::copy(first1, last1, out);
}

не нужен (и неуместен) .

...