1、力扣1356使用了匿名函数,总结一下
sort(arr.begin(),arr.end(),[&](int x,int y){
if (bit[x] < bit[y]) {
return true;
}
if (bit[x] > bit[y]) {
return false;
}
return x < y;
}
);
把lambda当作一个排序的准则交给sort去排序,返回的是x < y 按照这个来排序
2、 Lambda表达式具体形式如下:
[capture](parameters)->return-type{body} // 输入捕获 参数
[导入,取用外部变量,值传递还是引用传递 = &](参数)
[...](...)mutable/throwspec -> retype{...}
mutable [...]这里面的数据是不是可以被改写
throwspec 丢出异常
(1)一看到中括号开头的就是匿名函数
#include <iostream>
using namespace std;
int main()
{
[] {
cout << "ssss" << endl;
};
}
这是一种写法,它不算是一个函数,他是一个对象,这样子写出来是没用的,没有输出
(2)后面加小括号,输出
[] {
cout << "ssss" << endl;
}();
侯捷老师说不加括号相当于一个类型type,加了括号相当于创建临时对象,但是他不是创建临时对象,他是直接调用,和我们的临时对象有些不同。
(3)我们常用的写法还是下面这种
#include <iostream>
using namespace std;
int main()
{
auto l = [] {
cout << "ssss" << endl;
};
l();
}
l()就是在调用,
总结 lambda就可以想象成一个函数对象,作用就像是一个function加小括号可以调用。
(4)[...](...)mutable/throwspec -> retype{...}
这三个只要有一个存在就必须写小括号,三个都没有,小括号可写可不写。
#include <iostream>
using namespace std;
int main()
{
int id = 0;
auto l = [id]()mutable {
cout << "id=" << id << endl;
++id;
};
l();
l();
}
//id= 0
//id= 1
等同于
#include <iostream>
using namespace std;
class Functor {
private:
int id = 0;
public:
void operator() () {//重载运算符()
cout << "id = " << id << endl;
++id;
}
};
int main()
{
Functor f;
f();
f();
//f.operator()();
//f.operator()();
}
//id= 0
//id= 1