【C++】lambda表达式


前言

本篇文章我们要学习的是lambda表达式,它是C++11新增的一种特别方便的语法,相较于之前的函数指针以及仿函数都方便了不少,下面就让我们一起来学习吧。

一、lambda表达式

1.1 lambda表达式出现的场景

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法,如果待排序元素为自定义类型,需要用户定义排序时的比较规则,如下面自定义的比较排序方式:

struct Goods
{
   
   
	string _name; // 名字
	double _price; // 价格
	int _evaluate; // 评价
	Goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{
   
   }
};
struct ComparePriceLess
{
   
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
   
		return gl._price < gr._price;
	}
};
struct ComparePriceGreater
{
   
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
   
		return gl._price > gr._price;
	}
};
int main()
{
   
   
	vector<Goods> v = {
   
    {
   
    "苹果", 2.1, 5 }, {
   
    "香蕉", 3, 4 }, {
   
    "橙子", 2.2,
	3 }, {
   
    "菠萝", 1.5, 4 } };
	sort(v.begin(), v.end(), ComparePriceLess());
	sort(v.begin(), v.end(), ComparePriceGreater());

	return 0;
}

随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式。

我们来看看使用lambda表达式的代码:

int main()
{
   
   
	vector<Goods> v = {
   
    {
   
    "苹果", 2.1, 5 }, {
   
    "香蕉", 3, 4 }, {
   
    "橙子", 2.2, 3 }, {
   
    "菠萝", 1.5, 4 } };
	
	// priceLess为lambda对象
	auto priceLess = [](const Goods& g1, const Goods& g2)->bool {
   
   return g1._price < g2._price; }; 
	sort(v.begin(), v.end(), priceLess);

	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2)->bool {
   
   
		return g1._price < g2._price; 
		});

	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2)->bool {
   
   
		return g1._price > g2._price;
		});

	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2)->bool {
   
   
		return g1._evaluate < g2._evaluate;
		});

	sort(v.begin(), v.end(), [](const Goods& g1<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

malloc不出对象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值