zoukankan      html  css  js  c++  java
  • 分割(partition,stable_partition)

    1. 将数组中的元素分为两部分,第一部分[first,middle)中的每个元素都是pred(i)为true,第二部分[middle,last)中的每个元素都是pred(i)为false
    2. 返回值为middle
    3. partition执行速度很快,除非要求稳定性使用stable_partition,否则使用partition
    4. partition不保证与原来的数组中元素相对顺序相同,sable_partition保证
    5. stable_partition是一个adpative算法,会试图分配内存缓冲区,其运行复杂度取决于缓冲区中有多少内存,最坏情况下没有分配任何内存,至多调用swap Nlog(N)次,N为last-first,最好情况下(缓冲区中有足够内存)与N呈线性关系,两种情况下pred都被调用N次
    template <class ForwardIterator, class UnaryPredicate>
    ForwardIterator partition (ForwardIterator first,ForwardIterator last, UnaryPredicate pred)
    {
        while (true)
        {
            while (true)
                if (first == last)//头指针等于尾指针,所有操作结束
                    return first;
                else if (pred(*first))//头指针所指元素不符合移动条件
                    ++first;
                else//头指针所指元素符合移动条件,跳出内循环
                    break;
        
            --last;//尾指针减1
            
            while (true)
                if (first == last)//头指针等于尾指针,所有操作结束
                    return first;
                else if (!pred(*last))//尾指针所指元素不符合移动条件
                    --last;
                else//尾指针所指元素符合移动条件,跳出内循环
                    break;
            iter_swap(first, last);//头尾指针所指元素彼此交换
            ++first;//头指针前进1,准备下一个外循环迭代
        }
    }
    template <class ForwardIterator, class UnaryPredicate>
    ForwardIterator stable_partition (ForwardIterator first,ForwardIterator last, UnaryPredicate pred);

  • 相关阅读:
    久未更 ~ 四之 —— Vsftpd出现 Failed to start Vsftpd ftp daemon错误
    久未更 ~ 三之 —— CardView简单记录
    久未更 ~ 二之 —— TextView 文字省略
    久未更 ~ 一之 —— 关于ToolBar
    【UVA1636】决斗Headshot
    【NOIP模拟】花园
    【UVA1262】Password
    【UVA10820】交表
    【UVA1635】哑元
    【UVA12716】GCD和XOR
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10386097.html
Copyright © 2011-2022 走看看