c++ sort 函数能对类或者结构体进行排序吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ sort 函数能对类或者结构体进行排序吗相关的知识,希望对你有一定的参考价值。

比如一个
class Student

public:
int grade;
int number;
string name;

//这个类换成数组也行

Student a[10];
然后录入十个学生的数据
sort函数能够根据number来排序整个类数组吗

  c++ sort 函数可以对类或者结构体进行排序:
  里面有个参数,可以用:
  1、sort(a,'ascend')%升序
  2、sort(a,'descend')%降序;
  3、a为向量或数组. 也可以这样:先对a求相反数,成-a,然后升序,然后再求相反数.(这只是很简单的数学技巧!在编程时相当有用!)
  4、如果你是C语言,我记得没有函数.你可以自己写.用一些排序算法实现.
参考技术A 是STL的sort函数么,使用迭代子的那个?
如果是那个的话,貌似右面可以输入谓词逻辑的,也就是说你定义一个比较函数,传递进去,它就能按照你给的谓词逻辑进行排序。

// 传递类型可能有问题,你自己调试一下  
bool compare(const Student& left, const Student& right)
return (left.number > right.number);
....
sort(a[0], a[9], compare);

你可以自己试一下。本回答被提问者采纳
参考技术B 可以的~~~
int cmp(const void *a, const void *b)

return ((Student*)a)->number - ((Student*)b)->number;


调用
sort(a, a+10, cmp);

结构体排序

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

这里为了方便使用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. }  

以上是关于c++ sort 函数能对类或者结构体进行排序吗的主要内容,如果未能解决你的问题,请参考以下文章

c++中参考C语言的qsort函数实现一个一个能对任意数据类型(包括结构体)的数组进行排序的函数

结构体排序

排序算法积累

结构体排序 sort排序

如何用sort对结构体进行排序

求教一个问题,如何用sort对结构体数组排序