请问,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按照你的函数排序就行了
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()排序?的主要内容,如果未能解决你的问题,请参考以下文章