前言
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
- YY的《C++》专栏
- YY的《C++11》专栏
- YY的《Linux》专栏
- YY的《数据结构》专栏
- YY的《C语言基础》专栏
- YY的《初学者易错点》专栏
- YY的《小小知识点》专栏
- 设计一个商品结构体如下所示
struct Goods
{
string _name; // 名字
double _price; // 价格
int _evaluate; // 评价
Goods(const char* str, double price, int evaluate)
:_name(str)
, _price(price)
, _evaluate(evaluate)
{}
};
- 如下所示,利用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;
}
为什么要引入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;
}