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

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

实验楼出品

 

posted @   王清河  阅读(264)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-03-07 1046. Shortest Distance (20)
2018-03-07 1042. Shuffling Machine (20)
2018-03-07 1003. Emergency (25)
点击右上角即可分享
微信分享提示