前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】lambda解决个性化排序问题(对比仿函数)(代码演示)

【C++】lambda解决个性化排序问题(对比仿函数)(代码演示)

作者头像
YY的秘密代码小屋
发布2024-01-23 10:17:08
1280
发布2024-01-23 10:17:08
举报
文章被收录于专栏:C++系列

在这里插入图片描述
在这里插入图片描述
YY的《小小知识点》专栏

一.lambda解决个性化排序问题

[1]设计商品结构体

  • 设计一个商品结构体如下所示
代码语言:javascript
复制
struct Goods
{
    string _name;  // 名字
    double _price; // 价格
    int _evaluate; // 评价

    Goods(const char* str, double price, int evaluate)
        :_name(str)
        , _price(price)
        , _evaluate(evaluate)
    {}
};

[2]利用仿函数(函数对象)解决个性化排序一览

  • 如下所示,利用sort函数+仿函数可以实现不同的个性化排序
  • 价格排大,价格排小,名字排大,名字排小…
代码语言:javascript
复制
//struct ComparePriceLess
struct Compare1
{
    bool operator()(const Goods& gl, const Goods& gr)
    {
        return gl._price < gr._price;
    }
};

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

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(), Compare1());  // 价格升序

	//sort(v.begin(), v.end(), Compare2());  // 价格降序

	//sort(v.begin(), v.end(), CompareEvaluateGreater());  // 评价的降序

	sort(v.begin(), v.end(), Compare1()); 
	sort(v.begin(), v.end(), Compare2());

	return 0;
}

[3]利用lambda解决个性化排序一览

为什么要引入lambda?

  • 我们可以观察[2]中用仿函数解决个性化排序会出现一个问题
  • 我们如果看到CompareEvaluateGreater()这个仿函数,我们能知道它是根据"评价的降序"来进行排序
  • 但是当我们看到Compare1()/Compare2(),我们并不能很直观知道它是根据什么来排序,需要找到该函数才明白

  • 以下是改造成lambda形式的基本使用
  • 具体详细的介绍部分在本篇博客的板块二中,这里展示基本使用方法[捕捉列表] (参数列表) mutable -> 返回值类型 { 函数体 }
  • 首先我们要知道,lamda其实是一个局部的匿名函数对象,常与auto搭配使用
代码语言:javascript
复制
   //[捕捉列表] (参数列表) mutable -> 返回值类型 { 函数体 }
	// 局部的匿名函数对象
	auto less = [](int x, int y)->bool {return x < y; };
	cout << less(1, 2) << endl;

  • 以下是改造成lambda形式的个性化排序
代码语言:javascript
复制
int main()
{
	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
	sort(v.begin(), v.end(), Compare1());
	sort(v.begin(), v.end(), Compare2());

	//auto goodsPriceLess = [](const Goods& x, const Goods& y)->bool {return x._price < y._price; };
	//                                                 没有返回值时此部分可省略
	auto goodsPriceLess = [](const Goods& x, const Goods& y){return x._price < y._price; };
	cout << goodsPriceLess(v[0], v[1]) << endl;
	sort(v.begin(), v.end(), goodsPriceLess);


	sort(v.begin(), v.end(), [](const Goods& x, const Goods& y) {
		return x._price < y._price; });

	sort(v.begin(), v.end(), [](const Goods& x, const Goods& y) {
		return x._price > y._price;});

	sort(v.begin(), v.end(), [](const Goods& x, const Goods& y) {
		return x._evaluate < y._evaluate;});

	sort(v.begin(), v.end(), [](const Goods& x, const Goods& y) {
		return x._evaluate > y._evaluate;});

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.lambda解决个性化排序问题
    • [1]设计商品结构体
      • [2]利用仿函数(函数对象)解决个性化排序一览
        • [3]利用lambda解决个性化排序一览
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档