C++ 如何复制只有两个迭代器的数据?

C++ 如何复制只有两个迭代器的数据?,c++,stl,C++,Stl,我正在创建一个合并排序算法,该算法的一个步骤涉及创建子数组,子数组是执行排序的序列的一部分。作为输入,我在容器的开始和结束处获取迭代器,然后在开始和结束之间找到一个中间迭代器,然后有必要根据收到的迭代器复制数据 template<class Iterator> void merge_sort(Iterator t_begin, Iterator t_end) { // Recursion ends when the sequence becomes 1

我正在创建一个合并排序算法,该算法的一个步骤涉及创建子数组,子数组是执行排序的序列的一部分。作为输入,我在容器的开始和结束处获取迭代器,然后在开始和结束之间找到一个中间迭代器,然后有必要根据收到的迭代器复制数据

  template<class Iterator>
    void merge_sort(Iterator t_begin, Iterator t_end)
    {
      // Recursion ends when the sequence becomes 1
      if(std::distance(t_begin, t_end) < 2) {
        return;
      }

      // Combining two sorted sequences
      auto merge = [](Iterator begin, Iterator middle, Iterator end) {
        // Supposed, subarrays are sorted
        const std::deque<std::remove_reference_t<decltype(*begin)>> left {begin, middle}, right {middle, end};

        auto left_it = left.begin(), right_it = right.begin();

        // Merge two subarrays into one sorted
        for(Iterator itr = begin; itr != end; ++itr) {
          if(left_it == left.end()) {
            *itr = *right_it++;
          } else if(right_it == right.end()) {
            *itr = *left_it++;
          } else if(*left_it <= *right_it) {
            *itr = *left_it++;
          } else {
            *itr = *right_it++;
          }
        }
      };

      Iterator middle = t_begin + static_cast<std::size_t>((std::distance(t_begin, t_end) / 2));
      merge_sort(t_begin, middle);
      merge_sort(middle, t_end);
      merge(t_begin, middle, t_end);
    }
模板
无效合并排序(迭代器t_开始,迭代器t_结束)
{
//当序列变为1时,递归结束
如果(标准::距离(t_开始,t_结束)<2){
返回;
}
//组合两个排序序列
自动合并=[](迭代器开始、迭代器中间、迭代器结束){
//假设子阵列已排序
const std::deque left{begin,middle},right{middle,end};
自动左_it=left.begin(),右_it=right.begin();
//将两个子数组合并为一个排序数组
for(迭代器itr=begin;itr!=end;++itr){
if(left_it==left.end()){
*itr=*右_it++;
}else if(right\u it==right.end()){
*itr=*左_it++;

否则,如果你正在寻找的不是一个C++的东西,那是一个算法的事情。用默认的(最快的)方式实现的合并器需要额外的临时内存。

有一些方法可以避免这种情况,称为就地合并或简单的就地合并。它是非常不平凡的,但是,搜索一下,你会发现有多种算法来完成这一点。

你所寻找的不仅仅是C++的东西,它是一个算法的事情。这种方法需要额外的临时内存


有一些方法可以避免这种情况,称为就地合并排序或简单的就地合并。但这非常重要,四处搜索,您会找到多种算法来执行此操作。

不,可能没有更优雅的方法。如果您要复制数据,您必须使用容器。您可以通过包含将选择权留给用户er或分配器。不相关,但使用
vector
s而不是
deque
s会更有效。不,可能没有更优雅的方法。如果要复制数据,必须使用容器。您可以选择容器或分配器。不相关,但使用更有效
vector
s而不是
deque
s。是的,我知道STL中有一个函数(std::merge)它结合了两个排序范围,比我编写的lambda函数更好地解决了我的问题。但问题的目的正是如何让两个迭代器在不绑定到特定容器的情况下获取数据副本。因此,如果将来会出现类似情况,我知道如何正确解决。谢谢对于建议的方法,我肯定会研究这些要点。“DmitryEmelyanov,我并没有谈论<代码> STD::合并< /COD>。无论如何,C++中,你负责内存管理,没有一个构造“存储这个,但我不在乎什么容器”。在C++中。在这些场景中,代码> STD::vector < /COD>应该是默认的选择,它是存储简单元素序列的最简单容器。是的,我知道在STL中有一个函数(STD::合并)。它结合了两个排序范围,比我编写的lambda函数更好地解决了我的问题。但问题的目的正是如何让两个迭代器在不绑定到特定容器的情况下获取数据副本。因此,如果将来会出现类似情况,我知道如何正确解决。谢谢对于建议的方法,我肯定会研究这些要点。“DmitryEmelyanov,我并没有谈论<代码> STD::合并< /COD>。无论如何,C++中,你负责内存管理,没有一个构造“存储这个,但我不在乎什么容器”。在C++中。在这些场景中,代码> STD::vector < /Cord>应该是默认的选择,它是存储简单元素序列的最简单容器。
const std::deque<std::remove_reference_t<decltype(*begin)>> left {begin, middle}, right {middle, end};