stl_algorithm算法之分割算法

Posted _xiaohaige

tags:

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

分割算法:

技术分享
7.49、template <class InputIterator, class UnaryPredicate>
bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last && pred(*first)) { //第一个while找到左边所有连续的符合pred函数的元素
    ++first;
  }
  while (first!=last) { //从第一个while获得的最后一个不符合pred函数的元素开始。
    if (pred(*first)) return false; //如果还存在满足pred函数的元素就返回FALSE,
    ++first;
  }
  return true;
}
技术分享
//所做的事情是:判断整个区间的元素是否是按照左右互不相同的规则进行分割的。
//这个函数经常会和其他函数进行交互使用。

 

技术分享
7.50、template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition (BidirectionalIterator first,
                   BidirectionalIterator last, 
                   UnaryPredicate pred)
{
  while (first!=last) {
    while (pred(*first)) { 
      ++first;
      if (first==last) return first; 
    }
    do { 
      --last; 
      if (first==last) return first; 
     } while (!pred(*last)); 
    swap (*first,*last); 
    ++first; 
  }
  return first;
}
//所做的事情是:将元素按照pred函数区分开,返回的是不符合pred函数条件的first。
技术分享

 

技术分享
7.51、template <class InputIterator, class OutputIterator1,
class OutputIterator2, class UnaryPredicate pred>
pair<OutputIterator1,OutputIterator2>
partition_copy (InputIterator first, InputIterator last,
         OutputIterator1 result_true, OutputIterator2 result_false,
         UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) {
      *result_true = *first; //符合pred函数的元素为result_true
      ++result_true;
    }
    else {
      *result_false = *first; //不符合pred函数的元素为result_false
      ++result_false;
    }
    ++first;
  }
  return std::make_pair (result_true,result_false);
}
//所做的事情是:将其组队。
技术分享

 

技术分享
7.52、template <class ForwardIterator, class UnaryPredicate>
ForwardIterator partition_point (ForwardIterator first, ForwardIterator last,
                   UnaryPredicate pred)
{
  auto n = distance(first,last);
  while (n>0)
  {
    ForwardIterator it = first;
    auto step = n/2;
    std::advance (it,step);
    if (pred(*it)) 
    { 
      first=++it; n-=step+1; 
    }
    else n=step;
  }
  return first;
}

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

stl_algorithm算法之排序算法

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

stl_algorithm算法之Max/Min算法

stl_algorithm算法之二分法查找

如何标记从卷积神经网络的分割算法生成的图像片段?

计算机视觉常用算法讲解