zoukankan      html  css  js  c++  java
  • lambda 表达式定制操作

    泛型算法中的定制操作

    许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作。

    • 普通排序算法:
    template<class RandomIterator>
    void sort(RandomIterator first,RandomIterator last){
        if(first >= last || first + 1 == last)
            return;
        if(last - first <= 20) 
            return bubble_sort(first,last,pred);
        auto mid = mid3(first,last-1,pred); //mid3 is unknow,is a function for calculating the mid?
        while(p1 < p2){
            while(pred(*p1,mid)&&(p1<p2)) ++p1;
               while(!pred(*p2,mid)&&(p1<p2)) --p2;
               if(p1 < p2){
                   swap(*p1,*p2);
           }
        }
        swap(*p1,*(last-2));  //what is sort ?
        sort(first,p1,pred);
        sort(p1+1,last,pred);
    }
    • 排序算法的定制操作

    排序算法只能由小到大。

    二排序算法的定制操作,多了一个类型BinaryPredicate,可以用来定制规则。

    template<class RandomIterator,class BinaryPredicate>
    void sort(RandomIterator first,RandomIterator last,BinaryPredicate){
        if(first >= last || first + 1 == last)
           return;
        if(last - first <= 20)
           return bubble_sort(first,last,pred);
        auto mid = mid3(first,last,pred);
        auto p1 = first, p2 = last - 2;
        while(p1 < p2){
            while(pred(*p1,mid) && (p1 < p2)) ++p1;
            while(!pred(*p1,mid) && (p1 < p2)) --p2;
            if(p1 < p2){
                swap(*p1,*p2);
            }
        }
        swap(*p1,*(last-2));
        sort(first,p1,pred);
        sort(p1+1,last,pred);
    }

    谓词:相当于一个动作,比如一个需求,希望从大到小,则可以先定义一个谓词(函数)

    bool cmp(const int& v1,const int &v2){
        return v1 > v2;
    }
    sort(v.begin(),v.end(),cmp);

    将该函数传递给sort算法时,就可以从小到大排序了。

    lambda表达式:

    在前面的例子中,定义了一个函数传递给sort算法,这个函数可以重复使用还好,如果使用一次的话就很麻烦。

    这种情况下lambda就可以用上了,它相当于谓语,没有定义函数。

    sort(v.begin(),v.end(),[]cmp(const int& int v1,const int& v2){
        return v1 > v2;
    }

    ---------------------------------------------------------------------------------------------------------------------

    实验楼出品

  • 相关阅读:
    css3
    ubuntu /mac 终端命令大全
    MarkDown的语法的简要规则
    向github上传一个项目
    datatable 去掉默认功能
    datatable 自定义筛选
    vuex
    es6入门教程
    datatable 指定添加排序,根据列的值来设置颜色
    在ios上块点击出现闪黑底
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10491284.html
Copyright © 2011-2022 走看看