c++11新特性--Lambda表达式
2016-09-14 20:34
429 查看
在刷题的过程中有时会用到lambda表达式,因此在查阅了相关资料后,写出自己对于lambda表达式的理解,如果有问题,欢迎指出。
lambda的优点是:可以编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加的容易理解和精简。
[] 为捕获对象,可以是外部变量,指针,引用等
() 为参数列表
opt 函数选项,如mutable等
ret 返回类型,可以不写,由编译器自动推导
{} 函数体
需要注意的是对于lambda表达式,这个函数默认标记的是const,因此如果以传值方式捕获变量,不能在函数体中改变其值,因为他是const熟悉,可以用引用方式捕获变量:
问题链接:
http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
此题的思路就是将数组中的数字进行排序,但是他不是基于大小进行排序的,而是基于字符串进行排序
基于字符串的321+32<32+321因此将321排在32的前面
因此排序的方法如下:
完整AC代码如下:
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; } };
相关文章推荐
- 【C++11新特性】 Lambda表达式
- C++11新特性之一——Lambda表达式
- Cocos2d-x_C++11新特性Lambda表达式
- C++11 新特性之 Lambda表达式
- C++11特性运用--lambda表达式
- C++11新特性:范围for循环和lambda表达式
- C++11 新特性之 Lambda表达式
- C++11新增特性Lambda表达式
- C++11新特性(3) lambda表达式(1)
- C++11新特性(3) lambda表达式(1)
- c++11的新特性
- C++11 新特性之 tuple
- C++11 新特性之 变长參数模板
- C++11新特性学习笔记—变长参数的宏定义以及__VA_ARGS__
- C++11新特性
- C++11新特性学习笔记—委托构造函数的使用
- C++11 新特性摘抄
- GCC 4.9.0 公布,提升 C++11 和 C++14 特性
- C++11重要特性:lambda+function
- Java8新特性lambda表达式有什么用(用法实例)