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;
}
时间: 2024-11-01 07:16:47

stl_algorithm算法之分割算法的相关文章

分水岭分割算法

建立不同目标间的分水岭(涨水法). 分水岭计算步骤: 1.设待分割图象为f(x,y),其梯度图象为g(x,y) 2.用M1, M2, -, MR表示g(x, y)中各局部极小值的象素,位置,C(Mi)为与Mi对应的区域中的象素坐标集合 3.用n表示当前灰度阈值,T[n]代表记为(u,v)的象素集合,g(u,v)<n, 4.对Mi所在的区域,其中满足条件的坐标集合Cn(Mi)可看作一幅二值图象 令 S 代表T[n]中的连通组元集合,对每个连通组元 ,s∈S[n],有3种可能性: (1) S ∩ C

MP4文件格式的解析,以及MP4文件的分割算法

mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime.以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心思,主要问题是处理mp4文件庞大的"媒体头".当然,流媒体点播也可以采用flv格式来做,flv也可以封装H.264视频数据的,不过Adobe却不推荐这么做,人家说毕竟mp4才是H.264最佳的存储格式嘛. 这几天整理并重构了一下mp4文件的解析程序,融合了分解与合并的程序,以前是c语言写的,应用在linux上运行的服务器程序上,现在改成

OpenCV学习(20) grabcut分割算法

http://www.cnblogs.com/mikewolf2002/p/3330390.html OpenCV学习(20) grabcut分割算法 在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好.算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一副图,我们只要选定一个四边形框,把框中的图像作为gra

快速中的分割算法的解析与应用

一,分割(partition)算法介绍 所谓分割算法,先选定一个枢轴元素,然后 将数组中的元素分成两部分:比枢轴元素小的部分都位于枢轴元素左边:比枢轴元素大的部分都位于枢轴元素右边 此时,枢轴元素在数组中的位置就被“永久地确定”下来了---将整个数组排序,该枢轴元素的位置不会变化. 另外,枢轴元素的选取对分割算法至关重要.一般而言,终极追求的是:将数组平分.因此,尽可能地让枢轴元素的选取随机化和靠近中位数. 这里采用“三数取中”法选取枢轴元素. 关于快速排序排序算法,可参考:http://www

基于Matlab的标记分水岭分割算法

转自:http://blog.sina.com.cn/lyqmath 1 综述 Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins"(

Matlab的标记分水岭分割算法

1 综述 Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins"(集水盆) and "watershed ridge line

基于数据波动性的分割算法

我们常见的分割算法有很多种,比如能量法,包络线法之类的,但这些算法难以实现实时分割,今天我给大家分享一个原创的分割算法,是在以前项目中用过的,这两天加以优化,最中整理了一个MATLAB版本的,给大家分享一下. 算法的原理简单介绍一下: 这里给出了一段肌音信号(已经分割好了),是用加速度传感器在手上采集的,每次完成一次动作,就会产生一个数据波动,如果我们需要分析这样一段信号的特征,需要先将这些信号分割出来.   我们在分析时,主要任务时提取出信号帧起始点对应的数据索引,这里我写了一个分割函数: f

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

七.算法:(算法头文件:<algorithm>) 所有的算法都需要iterator的支持,列如支持++,*,op=,op==,等等.. 非变动性算法: 7.1.template<class InputIterator, class UnaryPredicate> bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred) //要所有的数据都是符合当前的条件才回返回TRUE,否则FALSE. {

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个