【C++11】

Lambda表达式是C++11引入的新特性,它允许在代码中定义匿名函数,无需预先声明。Lambda在编译时转化为函数对象,这些对象包含参数列表、返回类型和函数体。与函数指针和函数符相比,Lambda更简洁且易用,它们都被用作函数对象,但Lambda通过自动的函数调用运算符重载提供了更直观的语法。

1. C++11 中 lambda 表达式的实现原理是什么?

什么是Lambda: C++11中引入的Lambda(λ)表达式是一种匿名函数,可以直接在代码中定义,而不需要在函数声明和定义的时候给定函数名,可以方便地作为其他函数的参数和返回值。

Lambda表达式的实现原理是: 在编译时将Lambda表达式转换为一个函数对象,并将该函数对象传递给需要使用Lambda表达式的函数。这个函数对象是一个匿名的类类型,其中包含Lambda表达式的参数列表、返回类型和函数体。在调用Lambda表达式时,实际上是调用了这个匿名类类型的重载函数调用运算符(),从而执行Lambda表达式的函数体。

  • 对比函数指针、函数符和Lambda函数: 这是三种传递函数的方法,通称为函数对象。
//函数指针
bool f3(int x) {return x%3 == 0;}
int count3 = std::count_if(numbers.begin(), numbers.end(), f3);

//函数符
class f_mod
{
	private:
		int dv;
		
	public:
		f_mod(int d= 1) : dv(d){}
		bool operator()(int x) {return x%dv == 0;}
};
count3 = std::count_if(numbers.begin(), numbers.end().end(), f_mod(3));
//f_mod(3)创建一个匿名对象,对象的dv为3. count_if通过这个对象调用operator()(),并将numbers中的元素传入x,并执行operator()(int x) 函数体中的内容。
//整个过程相当于
//f_mod obj(3);
//count3 = std::count_if(numbers.begin(), numbers.end().end(), obj);//重载函数调用运算符()使得类对象能够像函数一样被调用

//Lambda函数
count3 = std::count_if( numbers.begin(), numbers.end().end(),[](int x){return x % 3 == 0;} );//编译器会把一个Lambda表达式生成一个匿名类的匿名对象,并在类中重载函数调用运算符,实现了一个operator()方法,从而执行Lmabda函数体的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值