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

2024-01-23 10:17:08 浏览数 (2)

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;
}

0 人点赞