在不创建新子向量的情况下获取向量的范围

Getting range of vector without creating a new subvector

本文关键字:向量 情况下 获取 范围 创建      更新时间:2023-10-16

我试图创建一个递归函数,每次它接受一个向量,像这样:

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

这里我试图传递一个向量,每次我调用函数mergesort再次。但是我必须创建两个临时向量first_tempsecond_temp,因为我不知道如何从main_vector中提取这个范围,而不创建一个新的临时向量来保存它的值。

是否有一种方法,我不需要创建持有人向量?比如main_vector[0:n]之类的?

传统的方法是使用迭代器作为范围:

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 .......
}

对于一些像range-v3这样的库,你可以直接使用range:

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 .......
}
相关文章: