C++ 四种方式自定义 sort 函数的比较规则 Shepard-Wang

一 重载 operator< 运算符

对于自定义的类,如果我们要比较大小或者使用 sort 排序,我们可以通过重载类的 operator< 运算符来完成:

#include<bits/stdc++.h>

using namespace std;

struct person
{
	string name;
	string ID;
	string sex;
	int age;
	bool operator<(const person& per)
	{
		if (age != per.age)
			return age < per.age;
		else if (sex != per.sex)
			return sex < per.sex;
		else
			return ID < per.ID;
	}
};

int main(void)
{
	person a = { "zhang san", "1999", "男", 27 };
	person b = { "xiao si", "2000", "男", 27 };

	bool flg = a < b;
	
	vector<person> v;
	v.push_back(b);
	v.push_back(a);

	sort(v.begin(), v.end());

	return 0;
}

二 重载 operator() 运算符

通过在类中重写 operator() 运算符,然后在 sort 函数中传入一个仿函数对象:

struct person
{
	string name;
	string ID;
	string sex;
	int age;
};

template<class T>
struct MyLess
{
	bool operator()(const T& lhs, const T& rhs)
	{

		if (lhs.age != rhs.age)
			return lhs.age < rhs.age;
		else if (lhs.sex != rhs.sex)
			return lhs.sex < rhs.sex;
		else
			return lhs.ID < rhs.ID;
	}
};

int main(void)
{
	person a = { "zhang san", "1999", "男", 27 };
	person b = { "xiao si", "2000", "男", 27 };

	vector<person> v;
	v.push_back(b);
	v.push_back(a);

	sort(v.begin(), v.end(), MyLess<person>());

	return 0;
}

functional 头文件中有 greater,less 类,其实和上面的实现差不多:

template <class T> struct greater {
  bool operator() (const T& x, const T& y) const {return x>y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

三 传入函数指针

只需要把类 MyLess 中的 operator() 函数放到类外并改个名字即可:

#include<bits/stdc++.h>

using namespace std;

struct person
{
	string name;
	string ID;
	string sex;
	int age;
};

bool cmp(const person& lhs, const person& rhs)
{
	if (lhs.age != rhs.age)
		return lhs.age < rhs.age;
	else if (lhs.sex != rhs.sex)
		return lhs.sex < rhs.sex;
	else
		return lhs.ID < rhs.ID;
}

int main(void)
{
	person a = { "zhang san", "1999", "男", 27 };
	person b = { "xiao si", "2000", "男", 27 };

	vector<person> v;
	v.push_back(b);
	v.push_back(a);

	sort(v.begin(), v.end(), cmp);

	return 0;
}

四 Lambda 表达式

Lambda 表达式通常适合定义比较规则简单的对象比较。并且 Lambda 表达式规则比较灵活,可以在不同的函数调用中定义不同的规则,operator< 一旦写好就只能“从一而终”了。

#include<bits/stdc++.h>

using namespace std;

int main(void)
{
	vector<int> v;

	v.push_back(9);
	v.push_back(5);
	v.push_back(2);
	v.push_back(7);

	sort(v.begin(), v.end(),
		[](const int& a, const int& b)->bool {
			return a > b; });

	return 0;
}

参考文章

  • https://blog.csdn.net/cnd2449294059/article/details/77090174
  • http://cplusplus.com/reference/algorithm/sort/?kw=sort