Lambda表达式
Background
在力扣做这道周赛题根据第 K 场考试的分数排序,我一开始用了呆呆的方法:
// sort按照第一个数字排序-> 先把第k列放到第一个,再sort,再把第k列放回原来的位置
for(int i=0;i<score.size();i++){
swap(score[i][0],score[i][k]);
}
sort(score.begin(),score.end());
// 升序转降序所以要reverse一下
reverse(score.begin(),score.end());
for(int i=0;i<score.size();i++){
swap(score[i][0],score[i][k]);
}
但是其实可以一行到位:
sort(score.begin(), score.end(),[k](vector<int>& a, vector<int>& b) {return a[k] > b[k];});
sort函数里的第三个参数,我看到过很多次,但一直没有懂是什么东西,所以一直用不来。
今天决定查一下,发现是Lambda表达式,准备来理一下相关的知识点。
Overview
C++程序设计语言里对Lambda表达式的定义是:它是定义和使用匿名函数对象的一种简便的方式……
大概来说,就是提供了一个简单的方法,便于我们把操作作为实参传给函数。
一条lambda表达式会包含一下部分:
[capture-list](parameter list)mutable->return_type{body}
- capture list: 可能为空,指明定义环境中哪些名字能被用在lambda表达式内
- parameter list: 可选的参数列表,指明lambda表达式需要的参数;
- mutable: 可选的修饰符,指明该lambda表达式可能会修改自身的状态(不是很懂,也不是很常用的修饰符);
- noexcept: 可选的修饰符;
- -> return_type: 声明返回类型;
- body: 表明了lambda表达式要执行的部分。
Usage
空捕获列表(不需要使用lambda表达式外层的变量):
void algo(vector<int>& v){
sort(v.begin(), v.end()); // ascending order by default
sort(v.begin(), v.end(), [](int x, int y){return abs(x) < abs(y);}); // ascending order by absolute value
}
非空捕获列表:
void f(vector<int>& v){
bool sensitive = true;
sort(v.begin(), v.end(), [sensitive](int x, int y){ return sensitive ? x<y : abs(x)<abs(y);} );
}