结构体排序和普通的整型实型数据排序的区别在于缺少比较规则需要人为的给出,我们可以通过重载<,>,<=,>=等比较运算符或者写一个比较函数,然后就像处理一般变量一样完成排序。
这里为了方便使用sort函数进行排序而不手写排序函数,sort函数是C++自带的排序函数,包含于头文件<algorithm>,函数的参数是数组的首地址和结束地址和比较函数,比较函数带有默认函数参数,默认调用 < 运算符,能直接对普通的基本数组进行由小到大排序,如果我们要利用sort函数来对结构体进行排序,我们必须手写一个比较函数来确定比较规则,或者重载<运算符,比如说我们有一个存放汉字的结构体,结构体中有存放笔画顺序的编号和拼音顺序的编号,如果我们要按照笔画顺序排序,我们的比较函数就比较的是笔画编号。
bool cmp(汉字 a , 汉字 b) 或者 bool operator < (汉字 a , 汉字 b)
{
return a.笔画编号<b.笔画编号;
}
这样就能将汉字按照笔画顺序进行升序排序,如果是要降序排序的话把小于号改为大于就行。
比较的规则可以根据自己实际需求来确定,可以多个比较来确定最终返回值,只要保证返回值是确定的true或者false就行
调用sort函数进行排序时这样写:
sort(A,A+1000,cmp) 或者重载<运算符后 sort(A,A+1000);
注意这里是加的1000而不是999,你可以将函数参数理解为一段连续区间,左闭右开,这样才能将整个排序数组所占的内存全部包含进去。
数组名A是数组首地址,A+1000是地址运算得到的是整个数组存放的内存的结束末尾,cmp是我们写的比较函数,同时也重载了<运算符。
完整的代码演示:
- #define _CRT_RAND_S
- #include<iostream>
- #include<cstdlib>
- #include<algorithm>
- using namespace std;
- int Rand(int MinNum, int MaxNum) { //生成范围可控的随机数的函数
- unsigned int TempData;
- rand_s(&TempData);
- int result = ((double)TempData / (double)UINT_MAX)*(double)(MaxNum - MinNum + 1);
- return result + MinNum;
- }
- struct date {
- int year;
- int month;
- int day;
- bool operator <(date& a) { //重载双目比较运算符<,此时结构体自身作为一个实参,另一个由调用时给出,这里也可以使用引用
- if (year != a.year)
- return year < a.year;
- else if (month != a.month)
- return month < a.month;
- else
- return day < a.day;
- }
- friend ostream& operator <<(ostream& cout, date& a) //重载输出用到的<<运算符 {
- cout << a.year << ‘-‘ << a.month << ‘-‘ << a.day;
- return cout;
- }
- };
- bool cmp(date& a, date& b) {
- if (a.year != b.year)
- return a.year > b.year;
- else if (a.month != b.month)
- return a.month > b.month;
- else
- return a.day > b.day;
- }
- int main() {
- date a[10];
- for (int i = 0; i < 10; i++) {
- a[i].year = Rand(1000, 2000);
- a[i].month = Rand(1, 12);
- a[i].day = Rand(1, 30);
- }
- cout << "ascending:" << endl << endl;
- sort(a, a + 10);
- for (int i = 0; i < 10; i++)
- cout << a[i] << endl;
- cout << endl;
- cout << "descending:" << endl << endl;
- sort(a, a + 10, cmp);
- for (int i = 0; i < 10; i++)
- cout << a[i] << endl;
- return 0;
- }