c++11新特性--Lambda表达式

在刷题的过程中有时会用到lambda表达式,因此在查阅了相关资料后,写出自己对于lambda表达式的理解,如果有问题,欢迎指出。

lambda的优点是:可以编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加的容易理解和精简。

Lambda的形式

[capture] (param) opt->ret{body;};
[] 为捕获对象,可以是外部变量,指针,引用等
() 为参数列表
opt 函数选项,如mutable等
ret 返回类型,可以不写,由编译器自动推导
{} 函数体

基本的Lambda使用

#include<iostream>
using namespace std;
int main() {
    auto basicLambda = [] {cout << "hello lambda"<<endl; };
    basicLambda();  //调用,输出hello lambda

    auto returnLambda = [](int a, int b) {return a + b; };
    int sum=returnLambda(1, 2);   //调用形式 
    cout << sum << endl;  

    //捕获变量
    double data = 1.23;
    auto captureLambda = [data] {cout << "data=" << data << endl; };
    captureLambda();
}

需要注意的是对于lambda表达式,这个函数默认标记的是const,因此如果以传值方式捕获变量,不能在函数体中改变其值,因为他是const熟悉,可以用引用方式捕获变量:

#include<iostream>
using namespace std;
int main() {
    auto changeLambda = [&data] {data = 5.21; return data; };
    cout << changeLambda()<<endl;  
    cout<<data<<endl;      //data变成了5.21;
}   

Lambda与STL的结合

lambda可以作为stl算法中的仿函数使用,在着用我们不必在算法外重新编写一个函数,可以使用lambda的匿名函数功能。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
    //找出满足条件的数
    vector<int> v = { 1,3,5,7,2,4,13,34,6,43 };
    //找出第一个大于10的数,返回他的迭代器
    auto t = find_if(v.begin(), v.end(), [](auto i) {return i > 10; });
    cout << *t << endl;  //13是第一个大于10的数

    int value = 10; 
    //满足值大于value的个数
    auto t1 = count_if(v.begin(), v.end(), [value](int i) {return i > value; });
    cout << t1 << endl;    //输出3

    //找到第一个不满足条件的数
    auto t2 = find_if_not(v.begin(), v.end(), [value](int i) {return i < 10; });
    cout << *t2 << endl;  //13

    //排序从大到小排序
    sort(v.begin(), v.end(), [](auto i, auto j) {return i > j; });
    for (auto c : v) cout << c << " ";
    cout << endl;
}

lambda使程序更加简单明了

一个具体的实例
问题链接:
http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

此题的思路就是将数组中的数字进行排序,但是他不是基于大小进行排序的,而是基于字符串进行排序

基于字符串的321+32<32+321因此将321排在32的前面
因此排序的方法如下:
sort(num.begin(),num.end(),[](const int& a,const int& b){
return to_string(a)+to_string(b)<to_string(b)+to_string(a);});

完整AC代码如下:

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        sort(numbers.begin(),numbers.end(),[](const int& a,const int& b){
         return to_string(a)+to_string(b)<to_string(b)+to_string(a);});
        string res;
        for (auto c:numbers)    //c++11 范围for循环
            res+=to_string(c);
        return res;
    }
};
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值