stl_algorithm算法之融合算法

Posted _xiaohaige

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stl_algorithm算法之融合算法相关的知识,希望对你有一定的参考价值。

融合算法:

技术分享
7.64、template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result)
{
  while (true) {
    if (first1==last1) return std::copy(first2,last2,result);
    if (first2==last2) return std::copy(first1,last1,result);
    *result++ = (*first2 < *first1)? *first2++ : *first1++; //使用op< 进行比较排序。
  }
}
//第一个区间和第二个区间进行融合,融合之后的result是排序好的。
技术分享

 

7.65、inplace_merge //合并

技术分享
7.66、template <class InputIterator1, class InputIterator2>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
  while (first2!=last2) {
    if ( (first1==last1) || (*first2 < *first1) ) return false;
    if (!(*first1<*first2)) ++first2;
    ++first1;
  }
  return true;
}
//所做的事情是:判断第一个区间是否包含在第二个区间中。前提是这两个区间是已经排序好的。
技术分享

 

技术分享
7.67、template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
               InputIterator2 first2, InputIterator2 last2,
               OutputIterator result)
{
  while (true)
  {
    if (first1==last1) return std::copy(first2,last2,result);
    if (first2==last2) return std::copy(first1,last1,result);
    if (*first1<*first2) 
    { 
      *result = *first1; ++first1; 
    }
    else if (*first2<*first1) 
    { 
      *result = *first2; ++first2; 
    }
    else 
    { 
      *result = *first1; ++first1; ++first2; 
    }
    ++result;
  }
  return result;
}
//所做的事情是:合并两个区间并排好序.
技术分享

 

技术分享
7.68、template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
                   InputIterator2 first2, InputIterator2 last2,
                   OutputIterator result)
{
  while (first1!=last1 && first2!=last2)
  {
    if (*first1 < *first2) 
      ++first1;
    else if (*first2 < *first1) 
      ++first2;
    else {
      *result = *first1;
      ++result; ++first1; ++first2;
    }
  }
  return result;
}
//所做的事情是:获得两个区间的交集,返回这个集合。
技术分享

 

技术分享
7.69、template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
                  InputIterator2 first2, InputIterator2 last2,
                  OutputIterator result)
{
  while (first1!=last1 && first2!=last2)
  {
    if (*first1<*first2) 
    { 
      *result = *first1; ++result; ++first1; 
    }
    else if (*first2<*first1) 
      ++first2;
    else 
    { 
      ++first1; ++first2;
    }
  }
  return std::copy(first1,last1,result);
}
//所做的事情是:获得第一个区间中与第二个区间不同的元素。
技术分享

 

技术分享
7.70、template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result)
{
  while (true)
  {
    if (first1==last1) return std::copy(first2,last2,result);
    if (first2==last2) return std::copy(first1,last1,result);
    if (*first1<*first2) 
    { 
      *result=*first1; ++result; ++first1; 
    }
    else if (*first2<*first1) 
    { 
      *result = *first2; ++result; ++first2;
    }
    else 
    { 
      ++first1; ++first2; 
    }
  }
}
//所做的事情是:获取两个区间中不同的元素。

以上是关于stl_algorithm算法之融合算法的主要内容,如果未能解决你的问题,请参考以下文章

stl_algorithm算法之排序算法

stl_algorithm算法之变动性算法和非动性算法

stl_algorithm算法之Max/Min算法

stl_algorithm算法之二分法查找

特定领域知识图谱融合方案:文本匹配算法之预训练SimbertERNIE-Gram单塔模型等诸多模型

特定领域知识图谱融合方案:文本匹配算法之预训练SimbertERNIE-Gram单塔模型等诸多模型