在C++之前,如果想对一个数据集合中的元素进行排序,可以用std::sort方法:

  • 对于内置类型数据排序,直接使用即可
  • 但对于自定义类型,需要我们自己定义排序规则

排序规则定义方法:

  • 函数指针:void(*ptr)(int x),用起来复杂难读,能不用就不用
  • 仿函数(常用):定义一个类,重载operator(),使得对象可以像函数一样使用

仿函数定义排序规则如:,

代码语言:javascript

AI代码解释

struct Goods
{
	 string _name;  // 名字
	 double _price; // 价格
	 int _evaluate; // 评价
	 Goods(const char* str, double price, int evaluate)
		 :_name(str)
		 , _price(price)
		 , _evaluate(evaluate)
	 {}
};

//以货物价格排升序
struct ComparePriceLess
{
	bool operator()(const Goods& gl, const Goods& gr)
	{
	 	return gl._price < gr._price;
	}
};

//以货物价格排降序
struct ComparePriceGreater
{
	 bool operator()(const Goods& gl, const Goods& gr)
	 {
	 	return gl._price > gr._price;
	 }
};

int main()
{
	 vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 
	3 }, { "菠萝", 1.5, 4 } };
	 sort(v.begin(), v.end(), ComparePriceLess());
	 sort(v.begin(), v.end(), ComparePriceGreater());
}

随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式。

代码语言:javascript

AI代码解释

int main()
{
	 vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 
	3 }, { "菠萝", 1.5, 4 } };
	 sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
	 return g1._price < g2._price; });
	 sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
	 return g1._price > g2._price; });
	 sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
	 return g1._evaluate < g2._evaluate; });
	 sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
	 return g1._evaluate > g2._evaluate; });
}

上述代码就是使用C++11中的lambda表达式来解决,可以看出lambda表达式实际是一个匿名函数,在函数内部直接定义使用。对比仿函数,使用lambda表达式可以使得代码更简洁,可读性更好


 

更多推荐