qsort用于对对象表进行排序

时间:2014-11-29 20:30:11

标签: c++ qsort

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

  1. 输入您要创建的点数。
  2. 对于每个点写下这些:name,x-position,y-position
  3. 程序应计算从点到原点的长度(0,0),它在函数Leng()
  4. 中计数
  5. 所有参数都保存在对象abc
  6. 然后我创建了TabOb对象表
  7. 我想从点和原点(0,0)之间的最小长度到点和原点之间的最大长度对点进行排序。我想使用stdlib.h中的qsort函数来完成此操作 我有一个创建比较功能的想法,这有助于我这样做,但我不确切知道如何。有人可以帮助我吗?
  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;
    }
    

2 个答案:

答案 0 :(得分:1)

如果您必须使用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);

qsort的第三个参数是您要比较的项目的大小。此外,比较函数期望Klasa*,而不是int&#39; s,所以你的演员都是错误的。关于这一点最糟糕的部分是编译器没有对你说什么,演员阵容不正确。这就是为什么在C ++中应该使用std::sort

我的比较很简单,因此请更改您需要比较的内容,因为我并不完全理解您在Klasa对象中想要比较的内容。


要与qsort进行比较,请使用std::sort

#include <algorithm>
//...
bool compare(Klasa& obj1, Klasa& obj2
{
    return obj1.x < obj2.x;
}
//...
TabOb = new Klasa[t];
std::sort(TabOb, TabObj + t, compare);

compare函数接受两个Klasa对象,如果obj1要在排序中的obj2之前发生,则返回true。否则返回false。我做了一个简单的排序标准,因此请更改compare以符合您的要求。

请注意,没有类型转换,并且比较要么返回truefalse,要么返回1,0和-1。在C ++程序中使用qsort不是必需的,不应该推荐IMO。相反,如果你正在编写C ++,总是更喜欢std::sort。如果您正在撰写C代码,那么这是一个不同的故事,因为您别无选择,只能使用qsort

此外,您的代码有内存泄漏。您可以在代码中使用std::vector代替new[]来缓解此问题。

答案 1 :(得分:0)

在比较函数中,您将参数转换为整数,而它们应该是klasa类型。在比较函数中,您必须计算点与原点之间的距离,这将是排序标准。 / p>

 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;
}

然后您应该将快速排序称为

   qsort(TabOb, t, sizeof(Klasa), compare);

因为类型又是klasa而不是int

最后你必须把你的比较功能放在你的课堂之外。