【C++】-c++11的知识点(中)--lambda表达式,可变模板参数以及包装类(bind绑定)

本文主要讲解C++11的知识点,包括lambda表达式、可变模板参数和包装类。介绍了lambda表达式的设计原因、使用方法,可变模板参数的展开方式及对性能的提升,还阐述了包装器的作用、用法以及bind函数的应用场景,帮助读者了解C++11的新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!


前言

今晚我们再来讲解c++11的知识点,上篇我们讲解到最关键的一个知识点就是右值引用,他可以提高性能,今天我们也会学到这个提高性能的东西,可变模板参数,再次之前我们要讲一个轻量化的知识点就是lambda表达式,他是让看上去比较沉重的仿函数变的轻量化,他是一个用起来比较方便但是语法优点奇葩的知识点,看上去非常不c++,最后我们再讲解一下包装类。话不多说,我们开始进入正文的讲解


一、为什么会设计出lambda表达式

再之前我们的仿函数大多数场景都是出现再比较大小上的,一般都是设计排序相关的操作需要这样设计,搜索树的插入实际也是再排序,优先级队列都是类似的操作,一般的我们的排序都不是对整型进行排序,现实中这样排序是没有意义的,所以我们一般都是对一个对象里面的某一个属性排序,从而知道另一个属性,就好比高考,我们是对分数进行排序,但是我们更想知道分数最高对应的是谁,所以通过上面的说明,我们来写一个示例代码:

#include<vector>
#include<algorithm>
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 CompareNameGreater
{
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
		return gl._price > gr._price;
	}
};

struct CompareNameLess
{
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
		return gl._name < gr._name;
	}
};

struct CompareEvaluateGreater
{
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
		return gl._price > gr._price;
	}
};

struct CompareEvaluateLess
{
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
		return gl._evaluate< gr._evaluate;
	}
};
struct CompareEvaluateGreater
{
   
	bool operator()(const Goods& gl, const Goods& gr)
	{
   
		return gl._evaluate > gr._evaluate;
	}
};
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());

	sort(v.begin(), v.end(), CompareNameLess());
	sort(v.begin(), v.end(), CompareNameGreater());

	sort(v.begin(), v.end(), CompareEvaluateLess());
	sort(v.begin(), v.end(), CompareEvaluateGreater());
}

我们总会有上面的需求,对商品不同的属性进行比较,上面则需要写六个类似的仿函数,这样就使得仿函数看上去太沉重了,所以为了解决这样的问题我们引入了lambda表达式,这个原先不是C++自己搞出来的,也是抄袭别人的,但是这东西确实好用,所以通过上面的案例,我先浅浅的带大家入门一下,看看lambda表达式时怎样解决这个问题的。

用法: (1)捕捉列表。(2)参数列表。(3)返回值。(4)函数体

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

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

	sort(v.begin(), v<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橘柚!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值