Rafael Adel
Rafael Adel

Reputation: 7759

Getting range of vector without creating a new subvector

I'm trying to create a recursive function where each time it accepts a vector, like this:

std::vector<int> mergesort(std::vector<int> &main_vector)
{
 //.......... rest of code .......

  middle = get_midpoint(unsorted_vector);
  first_temp.insert(first_temp.begin(), main_vector.begin(), middle);
  second_temp.insert(second_temp.begin(), middle, main_vector.end());
  first_half = mergesort(first_temp);
  second_half = mergesort(second_temp);

  //.......... rest of code .......

  return main_vector;

}

Here I'm trying to pass a vector each time I call the function mergesort again. But I had to create two temporary vectors first_temp and second_temp, because I don't know how to just extract that range from main_vector without creating a new temporary vector to hold its value.

Is there a way that I won't need to create holder vectors ? like main_vector[0:n] or something ?

Upvotes: 1

Views: 165

Answers (1)

Jarod42
Jarod42

Reputation: 217065

Traditional way is to use iterator as range:

template <typename Iterator>
void mergesort(Iterator begin, Iterator end)
{
  const auto middle = get_midpoint_it(begin, end);

  // .......... rest of code .......

  mergesort(begin, middle);
  mergesort(middle, end);

  // .......... rest of code .......
}

With some library as range-v3, you may use range directly:

template <typename Range>
void mergesort(Range&& range)
{
  const auto middle = get_midpoint_index(range);

  // .......... rest of code .......

  mergesort(range | ranges::view::slice(0, middle));
  mergesort(range | ranges::view::slice(middle, (int) range.size()));

  // .......... rest of code .......
}

Upvotes: 2

Related Questions