sort函数能对结构体进行排序吗?

Posted

tags:

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

比如我的结构体是:struct node int a,b,c;array[10001];我想用sort函数对b进行升序排序,该怎样写?谢谢。

std::sort()函数的功能很强大,且可以对类,结构体等元素进行排序。
首先来看看std中的快速排序算法sort的使用方法:
  template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
  这是一个带模板的函数,参数1和2表示需要排序的元素在随机迭代器的起始位置和结束位置,其迭代器指向的数据类型可以自己定义,常见的数据类型包括结构体,vector,类等都可以被使用。参数comp是用来决定所采用的排序是升序还是逆序的,默认情况下是升序排列。但是这种默认情况的优势是处理迭代器指向的元素为普通的数据类型,比如说整型,字符型等。如果指向的数据类型为类或者结构体,然后使用该类或者结构体中的某个元素进行排序,这时候需要自己定义排序的重载符号”<”。比如说在本次实验中该重载符号的定义为:
/*按照降序排列*/
bool compare(const PAIR &x, const PAIR &y)

return x.point_value > y.point_value;


  如果将comp定义为一个函数(网上好像很多都是用这种类似的函数),比如说该函数如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)

return x.point_value > y.point_value;


  则会报错如下错误:
  
  std::sort因为函数参数不明确,所以无法推导出模板参数等.
  实验结果
  本次实验是基于这样一个问题的:有一些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应一个数,现在需要对这些数排序从而达到对这些坐标点排序。有尝试过把点的坐标和它对应的值放在map中,然后对map中的元素用std::sort()进行排序,但是由于开始没有发现那个重载符号的使用,所以没有调试成功。现在直接不用map了,而是用vector,vector里面放的是带有坐标点和其对应值的struct。
  本次实验是在vector中存入3个结构体对象,每个结构体中放入一个二维点和它对应的值,然后采用sort()对齐排序,排序结果如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)

return x.point_value > y.point_value;


///*按照降序排列*/
//bool compare(const PAIR &x, const PAIR &y)
//
// return x.point_value > y.point_value;
//

void main()

PAIR pair1, pair2, pair3;
std::vector<PAIR> vec;
pair1.point = Point(10, 20);
pair1.point_value = 100;
pair2.point = Point(70, 30);
pair2.point_value = 99;
pair3.point = Point(44, 76);
pair3.point_value = 101;

vec.push_back(pair1);
vec.push_back(pair2);
vec.push_back(pair3);
// std::sort(vec.begin(), vec.end(), compare);
std::sort(vec.begin(), vec.end());
cout << "排序的结果为:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it != vec.end(); ++it)
cout << it->point << endl;

  
参考技术A 可以对结构体中的某一个署执行或字符串型的域进行排序,不能对结构体进行排序。 参考技术B 同类型结构体变量可以直接赋值的。
#include <stdio.h>
struct node

int a,b,c;
array[10001],tmp;
void main()

//这里可以调用sort函数了
//它接受结构体数组和数组长度
//具体看你为结构体赋了多少值

void sort(struct node *a,int n)

int i,j;
for(i=0;i<n-1;i++)

for(j=0;j<n-i-1;j++)

if(a[i].b>a[i+1].b)

tmp=a[i+1];
a[i+1]=a[i];
a[i]=tmp;



结构体排序

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

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

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

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

结构体vector sort()

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

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

结构体排序

在python中以某列为分组对象还能对某列进行依次排序吗