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

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

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

[1]设计商品结构体

  • 设计一个商品结构体如下所示
struct Goods
{
    string _name;  // 名字
    double _price; // 价格
    int _evaluate; // 评价
    Goods(const char* str, double price, int evaluate)
        :_name(str)
        , _price(price)
        , _evaluate(evaluate)
    {}
};

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

  • 如下所示,利用sort函数+仿函数可以实现不同的个性化排序
  • 价格排大,价格排小,名字排大,名字排小…
//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搭配使用
//[捕捉列表] (参数列表) mutable -> 返回值类型 { 函数体 }
  // 局部的匿名函数对象
  auto less = [](int x, int y)->bool {return x < y; };
  cout << less(1, 2) << endl;
  • 以下是改造成lambda形式的个性化排序
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;
}


相关文章
|
2月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
51 2
|
2月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
111 0
|
6天前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
6天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
6天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
6天前
|
算法 编译器 程序员
C++ 11新特性之Lambda表达式
C++ 11新特性之Lambda表达式
|
6天前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
1月前
|
C++
C++(十七)仿函数
### Functor 仿函数简介 Functor(仿函数)是一种通过在类中实现 `operator()` 使其行为像函数的对象。这种方式可以让类拥有更多可定制的功能,同时保持函数般的简洁调用方式。下面展示了如何定义和使用一个计算幂运算的仿函数类,并通过示例说明了其在 `std::sort` 中的优势与灵活性。
|
2月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
48 2
|
2月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
23 1
下一篇
无影云桌面