请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?相关的知识,希望对你有一定的参考价值。

我查找了很多资料,对于动态数组排序,现有资料一般都是关于Java的。C++中的对象数组可以用sort()或qsort()排序吗?如果可以做到,请问如何实现?
具体思路是这样的,
1)我建立了一个类(该类派生于CArray类,并建立动态数组),这个类里面有3个数据,以其中某个名为“result”的浮点型数据作为排序依据。
2)建立比较函数,再用sort()函数排序。
无以为报,只能给点分数,谢谢!
补充,(CResult是我自己定义的一个类,该类中有一个成员变量为 double: m_d_result)
比较函数为
less_second(const void *a, const void *b)

return (*(CResult *)a).m_d_Result > (*(CResult *)b).m_d_Result?true:false;


主函数中包含的相关代码

CArray<CResult,CResult&>m_Array_Result;
qsort(m_Array_Result,m_Array_Result.GetSize(),sizeof(m_Array_Result.GetAt(1)),less_second); //对于动态数组m_Array_Result,对其全体对象,按照m_d_result的大小排序

VC6编译出错1处:
error C2664: 'qsort' : cannot convert parameter 1 from 'class CArray<class CResult,class CResult &>' to 'void *'

使用sort排序结构体网上例子很多的 就是先写一个排序函数
然后让sort按照你的函数排序就行了

STL 里面有个 sort 函数,可以直接对数组排序,复杂度为 n*log2(n) 。使用这个函数,需要包含头文件。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是 [a,b) 。简单来说,有一个数组 int a[100] ,要对从 a[0] 到 a[99] 的元素进行排序,只要写 sort(a,a+100) 就行了,默认的排序方式是升序。
拿我出的“ AC 的策略”这题来说,需要对数组 t 的第 0 到 len-1 的元素排序,就写 sort(t,t+len);
对向量 v 排序也差不多, sort(v.begin(),v.end());
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是 bool 型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数 cmp
bool cmp(int a,int b)

return a>b;

排序的时候就写 sort(a,a+100,cmp);
假设自己定义了一个结构体 node
struct node
int a;
int b;
double c;

有一个 node 类型的数组 node arr[100] ,想对它进行排序:先按 a 值升序排列,如果 a 值相同,再按 b 值降序排列,如果 b 还相同,就按 c 降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)

if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;
return return x.c>y.c;

排序时写 sort(a,a+100,cmp);追问

我补充的程序概述中,VC说qsort的第一个参数给的不对。似乎数组类的名字可以做第一个参数,但是动态数组的类名不能做第一个参数。

参考技术A //假设类名为A,比较函数可以这样写
bool cmp(A m,A n)


    return m.result < n.result; //小于是从小到大

使用的时候是这样
A array[SIZE];
....//各种赋值修改操作
sort(array,array+SIZE,cmp);//排序

参考技术B class Array

double data;
float result;
s[100]

//按照result的值从小到大将类排序

int cmp( const void *a ,const void *b)

return (*(Array *)a).result > (*(Array *)b).result ? 1 : -1;


qsort(s,100,sizeof(s[0]),cmp);

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

【中文标题】c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?【英文标题】:c++ How do I call a constructor with arguments of a class that is inside an array of structures when I create the array of structures? 【发布时间】:2019-02-02 23:45:13 【问题描述】:

如何将构造函数参数传递给结构数组中的类? 我正在尝试使用链表实现。 我有一个区域数组,每个区域都有一个linkedList,Sll。 (实际上我会有一个二维数组。)我无法找到/弄清楚使用非默认参数/参数实际调用构造函数的语法。

我想将 Sll 保留为一个类。

class Sll

  public:
  unsigned long count;
  unsigned long uMaxEntries;
  void *pDataArray;
  int iSizeOfEachEntry;
  Sll( unsigned long uInSizeOfEachEntry,  unsigned long uInitNumEntries = INIT_NUM_ENTRIES );


Sll::Sll(unsigned long uInSizeOfEachEntry, unsigned long uInitNumEntries)

  uMaxEntries = uInitNumEntries;
  iSizeOfEachEntry = uInSizeOfEachEntry;
  pDataArray = malloc(iSizeOfEachEntry * uInitNumEntries);
  count=0;


...
struct Region 
  int lotsOfOtherStuffToo;
  Sll sllParticles;
;
...
  for(int ii = 0; ii < regionsX; ++ii)
      ppRegions[ii] = new Region[regionsY];  // How call the Sll constructor?

【问题讨论】:

新位置.. 【参考方案1】:

这里的数组有点让人分心。

您有一个不能默认构造的类Region,因为它包含一个也不能默认构造的Sll 类型的成员。所以,你给它一个构造函数。

然后,解决了这个问题,您回到数组:如何创建非默认 Region 对象的数组? By using a vector.

【讨论】:

以上是关于请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?的主要内容,如果未能解决你的问题,请参考以下文章

C++动态创建类的对象

C++中的类和对象

C++中,一个类,究竟有多少隐藏的默认函数?

请问java不同类的对象怎么放在同一个数组,然后如何对这个数组进行遍历

C++中类对象数组的初始化

jniC++怎么返回java的对象数组