C++11引入了lambda表达式,lambda表达式支持你定义一个局部的匿名函数,通常这个函数是一次性使用的
[capture-list](parameter)mutable->return-type{statement}
注意:lambda表达式是有类型的,类型大多数情况是随机的,调用lambda表达式需要使用一个变量接收lambda表达式,通常与auto配合使用
int main()
{
auto i = [] {std::cout << "lambda" << std::endl; };
i();//调用lambda表达式
//运行结果:
//lambda
return 0;
}
int main()
{
auto Swap = [](int& x, int& y){
int temp = x;
x = y;
y = temp;
};
int x = 10, y = 20;
Swap(x, y);
std::cout << "x = " << x << " , y = " << y << std::endl;
//运行结果:
//x = 20 , y = 10
return 0;
}
捕捉列表:指定lambda函数体内可以访问的外部变量。
捕捉方式:
值捕捉:
int main()
{
int x = 10, y = 20;
//值捕捉,捕捉的时x和y的拷贝,默认x和y无法被修改,加上mutable则可以修改x和y
auto print = [x, y]()mutable{
x = 1;
y = 2;
std::cout << "x = " << x << " , y = " << y << std::endl;
};
print();
//运行结果:
//x = 1, y = 2
return 0;
}
引用捕捉:
int main()
{
int x = 10, y = 20;
//引用捕捉,捕捉的是外部变量本身,默认可以被修改
auto Swap = [&x, &y] (){
int temp = x;
x = y;
y = temp;
};
Swap();
std::cout << "x = " << x << " , y = " << y << std::endl;
//运行结果:
//x = 20 , y = 10
return 0;
}
int main()
{
int x = 10, y = 20;
//值捕捉方式捕捉main函数中的所有变量
auto print1 = [=]()mutable{
x = 1;
y = 2;
std::cout << "x = " << x << " , y = " << y << std::endl;
};
//引用捕捉方式捕捉main函数中的所有变量
auto print2 = [&](){
x = 1;
y = 2;
std::cout << "x = " << x << " , y = " << y << std::endl;
};
print1();
print2();
//运行结果:
//x = 1, y = 2
//x = 1, y = 2
return 0;
}
特例:
int main(){
int a = 0;
int b = 1;
int c = 2;
int d = 3;
const int e = 1;
cout << &e << endl;
// 引用的方式捕捉所有对象,除了a
// a用传值的方式捕捉
auto func = [&, a] {
//a++;
b++;
c++;
d++;
//e++;
cout << &e << endl;//const & 得到的是同一个地址
};
func();
return 0;
}
仿函数:
#include
class Add {
public:
int operator()(int a, int b) const {
return a + b;
}
};
int main() {
Add add;
int result = add(10, 20);
std::cout << "Result: " << result << std::endl;
return 0;
}
lambda底层使用的是用仿函数实现的
auto print = [] {
008123AF xor eax,eax
008123B1 mov byte ptr [ebp-0D5h],al
std::cout << "Hello , World" << std::endl;
};
print();
008123B7 lea ecx,[print]
008123BA call <lambda_0596717148ff8a7e4509ccb4cd363cfe>::operator() (0812190h)
lambda表达式之间不能相互赋值
int main()
{
//1、print1和print2无法相互赋值
auto print1 = [] {
std::cout << "Hello , World" << std::endl;
};
auto print2 = [] {
std::cout << "Hello , World" << std::endl;
};
//2、以auto生成一个print1变量的副本
auto print1_temp = print1;
//3、以decltype把comp_less的类型传给func
//lambda变量的默认构造被delete了,需要使用拷贝构造传参
auto comp_less = [](int* x, int* y) {
return *x < *y;
};
std::priority_queue<int*, std::vector<int*>, decltype(comp_less)> pq(comp_less);
return 0;
}