C++ qsort用于对对象表进行排序
我的程序应该是这样工作的:C++ qsort用于对对象表进行排序,c++,qsort,C++,Qsort,我的程序应该是这样工作的: 输入要创建的点数 对于每个点,写下以下内容:名称、x位置、y位置 程序应该计算从点到原点的长度(0,0),它在函数Leng()中计数 所有参数都保存在对象abc中 然后创建对象表选项卡 我想对点进行排序,从点和原点之间的最小长度(0,0)到点和原点之间的最大长度。我想使用stdlib.h中的qsort函数来实现这一点 我有一个创建比较函数的想法,这有助于我做到这一点,但我不知道具体如何创建。有人能帮我吗 最后,我将给出一个输入和输出示例: 输入: 2 B 6 8
2
B 6 8
A 9 12
D 3 4
输出:
D 3 4
B 6 8
A 9 12
这是我的代码:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Klasa {
string name;
int x,y;
double rr,leng;
Klasa* TabOb;//table of objects
int t;//number of points
public:
Klasa(){}
Klasa(string name, int x,int y) {
this->name = name;
this->x = x;
this->y = y;
this->leng = Leng();
}
double Leng(){
double rr, sq;
rr = x*x + y*y;
sq = sqrt(rr);
return sq;
}
int getX() { return x; }
int getY(){ return y; }
string getName() { return name; }
double getLength(){ return leng; }
int compare(const void * a, const void * b)
{
int _a = *(int*)a;
int _b = *(int*)b;
if (_a < _b) return -1;
else if (_a == _b) return 0;
else return 1;
}
void InputData(){
cin >> t;
TabOb = new Klasa[t];
for (int i = 0; i < t; i++){
string name;
int x, y;
cin >> name;
cin >> x;
cin >> y;
Klasa abc(name, x, y);
TabOb[i] = abc;
}
qsort(TabOb, t, sizeof(int), compare);
for (int i = 0; i < t; i++){
cout << TabOb[i].getName() << " " << TabOb[i].getX() << " " << TabOb[i].getY() << " " << TabOb[i].getLength() << endl;
}
}
}wy;
int main() {
wy.InputData();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
克拉萨级{
字符串名;
int x,y;
双rr,冷;
Klasa*TabOb;//对象表
int t;//点数
公众:
Klasa(){}
Klasa(字符串名,整数x,整数y){
此->名称=名称;
这个->x=x;
这->y=y;
这->冷=冷();
}
双冷{
双rr,sq;
rr=x*x+y*y;
sq=sqrt(rr);
返回sq;
}
int getX(){return x;}
int getY(){return y;}
字符串getName(){return name;}
double getLength(){return leng;}
整数比较(常数无效*a,常数无效*b)
{
int _a=*(int*)a;
int _b=*(int*)b;
如果(_a<_b)返回-1;
else if(_a==_b)返回0;
否则返回1;
}
void InputData(){
cin>>t;
TabOb=新Klasa[t];
for(int i=0;i>名称;
cin>>x;
cin>>y;
克拉萨abc(姓名,x,y);
TabOb[i]=abc;
}
qsort(TabOb,t,sizeof(int),compare);
for(int i=0;i cout在比较函数中,您将参数转换为整数,而它们应为klasa
类型。接下来在比较函数中,您必须计算点到原点的距离,这将是排序标准
int compare(const void * a, const void * b)
{
Klasa j = *(Klasa*)a;
Klasa k = *(Klasa*)b;
int temp1=sqrt(pow((double) j.getX(),2)+pow((double) j.getY(),2));
int temp2=sqrt(pow((double) k.getX(),2)+pow((double) k.getY(),2));
if (temp1 < temp2) return -1;
else if (temp1 == temp2) return 0;
else return 1;
}
因为类型也是klasa
而不是int
最后,您必须将比较函数放在类外。如果必须使用qsort
,则必须进行以下更改:
int compare(const void * a, const void * b)
{
Klasa* obj1 = (Klasa*)a;
Klasa* obj2 = (Klasa*)b;
if (obj1->x < obj2->x)
return -1;
else
if (obj1->x == obj2->x)
return 0;
return 1;
}
//...
qsort(TabOb, t, sizeof(Klasa), compare);
compare
函数接受两个Klasa对象,如果排序中obj1出现在obj2之前,则返回true
。否则返回false
。我执行了一个简单的排序标准,因此更改compare
,以符合您的要求
注意,没有类型转换,比较返回“代码>真< //>或代码> false <代码>,不是1, 0,-1。在C++程序中使用<代码> qStase<代码>不是必需的,IMO不应该被推荐。相反,总是喜欢<代码> STD::排序< /代码>如果你正在写C++。如果你写的是代码> C<代码/代码>代码,那就是DI。不同的故事,因为您除了使用
qsort
之外别无选择
另外,您的代码存在内存泄漏。您可以通过在代码中使用std::vector
而不是new[]
来缓解此问题。为什么不使用std::sort
?另外,我会问您——我给您两个TabOj对象。您的标准是什么(以及最终的排序)排序时,哪一项在另一项之前?不管是什么,这就是您要编码的内容。而且,std::sort
使这更简单,因为您没有执行void*之类的东西和所有其他非类型安全的编码。此外,我不明白您在compare
函数中做了什么。您正在排序Klasa
o对象,但由于某种原因,您将类型强制转换为int*,而该类型应强制转换为Klasa*。这看起来不正确。这就是为什么使用std::sort强制您使用正确的类型,而不是像现在这样对int*进行伪转换。
int compare(const void * a, const void * b)
{
Klasa* obj1 = (Klasa*)a;
Klasa* obj2 = (Klasa*)b;
if (obj1->x < obj2->x)
return -1;
else
if (obj1->x == obj2->x)
return 0;
return 1;
}
//...
qsort(TabOb, t, sizeof(Klasa), compare);
#include <algorithm>
//...
bool compare(Klasa& obj1, Klasa& obj2
{
return obj1.x < obj2.x;
}
//...
TabOb = new Klasa[t];
std::sort(TabOb, TabObj + t, compare);