码迷,mamicode.com
首页 > 编程语言 > 详细

结构体排序

时间:2018-03-10 15:51:29      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:数组   连续   and   区别   变量   highlight   opera   star   main   

结构体排序和普通的整型实型数据排序的区别在于缺少比较规则需要人为的给出,我们可以通过重载<,>,<=,>=等比较运算符或者写一个比较函数,然后就像处理一般变量一样完成排序。

这里为了方便使用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是我们写的比较函数,同时也重载了<运算符。

 完整的代码演示:

 

[cpp] view plain copy
 
  1. #define _CRT_RAND_S  
  2. #include<iostream>  
  3. #include<cstdlib>  
  4. #include<algorithm>  
  5. using namespace std;  
  6.   
  7. int Rand(int MinNum, int MaxNum)   {   //生成范围可控的随机数的函数
  8.     unsigned int TempData;  
  9.     rand_s(&TempData);  
  10.     int result = ((double)TempData / (double)UINT_MAX)*(double)(MaxNum - MinNum + 1);  
  11.     return result + MinNum;  
  12. }  
  13. struct date  {  
  14.     int year;  
  15.     int month;  
  16.     int day;  
  17.     bool operator <(date& a)  {  //重载双目比较运算符<,此时结构体自身作为一个实参,另一个由调用时给出,这里也可以使用引用  
  18.         if (year != a.year)  
  19.             return year < a.year;  
  20.         else if (month != a.month)  
  21.             return month < a.month;  
  22.         else  
  23.             return day < a.day;  
  24.     }  
  25.       
  26.     friend ostream& operator <<(ostream& cout, date& a)  //重载输出用到的<<运算符  {  
  27.         cout << a.year << ‘-‘ << a.month << ‘-‘ << a.day;  
  28.         return cout;  
  29.     }  
  30. };  
  31. bool cmp(date& a, date& b)  {  
  32.     if (a.year != b.year)  
  33.         return a.year > b.year;  
  34.     else if (a.month != b.month)  
  35.         return a.month > b.month;  
  36.     else  
  37.         return a.day > b.day;  
  38. }  
  39. int main() {  
  40.     date a[10];  
  41.     for (int i = 0; i < 10; i++) {  
  42.         a[i].year = Rand(1000, 2000);  
  43.         a[i].month = Rand(1, 12);  
  44.         a[i].day = Rand(1, 30);  
  45.     }  
  46.     cout << "ascending:" << endl << endl;  
  47.     sort(a, a + 10);  
  48.     for (int i = 0; i < 10; i++)  
  49.         cout << a[i] << endl;  
  50.     cout << endl;  
  51.     cout << "descending:" << endl << endl;  
  52.     sort(a, a + 10, cmp);  
  53.     for (int i = 0; i < 10; i++)  
  54.         cout << a[i] << endl;  
  55.     return 0;  
  56. }  

结构体排序

标签:数组   连续   and   区别   变量   highlight   opera   star   main   

原文地址:https://www.cnblogs.com/TAMING/p/8538933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!