C++ qsort用于对对象表进行排序

C++ qsort用于对对象表进行排序,c++,qsort,C++,Qsort,我的程序应该是这样工作的: 输入要创建的点数 对于每个点,写下以下内容:名称、x位置、y位置 程序应该计算从点到原点的长度(0,0),它在函数Leng()中计数 所有参数都保存在对象abc中 然后创建对象表选项卡 我想对点进行排序,从点和原点之间的最小长度(0,0)到点和原点之间的最大长度。我想使用stdlib.h中的qsort函数来实现这一点 我有一个创建比较函数的想法,这有助于我做到这一点,但我不知道具体如何创建。有人能帮我吗 最后,我将给出一个输入和输出示例: 输入: 2 B 6 8

我的程序应该是这样工作的:

  • 输入要创建的点数
  • 对于每个点,写下以下内容:名称、x位置、y位置
  • 程序应该计算从点到原点的长度(0,0),它在函数Leng()中计数
  • 所有参数都保存在对象abc中
  • 然后创建对象表选项卡
  • 我想对点进行排序,从点和原点之间的最小长度(0,0)到点和原点之间的最大长度。我想使用stdlib.h中的qsort函数来实现这一点 我有一个创建比较函数的想法,这有助于我做到这一点,但我不知道具体如何创建。有人能帮我吗
  • 最后,我将给出一个输入和输出示例:

    输入:

    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;icout在比较函数中,您将参数转换为整数,而它们应为
    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);