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;
    }

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

    实验楼出品

  • 相关阅读:
    在Eclipse 2.0中使用版本控制系统CVS
    如何战胜软件测试的困境
    AJAX核心对象 XMLHttpRequest 对象使用详解 (二)
    javascript动态增加、删除、填充表格内容
    如何把SourceSafe中的数据转换成CVS的数据
    SOAP协议初级指南 (三)
    C#.Net的常见面试试题
    【转】jQuery中的编程范式 拓荒者
    DataTable的Compute方法和Expression语法 拓荒者
    下载网页内容,并编译生成CHM文件 拓荒者
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10491284.html
Copyright © 2011-2022 走看看