请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?
我查找了很多资料,对于动态数组排序,现有资料一般都是关于Java的。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 *' 展开
具体思路是这样的,
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 *' 展开
3个回答
展开全部
使用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);
然后让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,比较函数可以这样写
bool cmp(A m,A n)
{
return m.result < n.result; //小于是从小到大
}
使用的时候是这样
A array[SIZE];
....//各种赋值修改操作
sort(array,array+SIZE,cmp);//排序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-23
展开全部
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);
{
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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询