天天看点

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){

继续阅读