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