3

我正在尝试使用 qsort() 对对象指针数组(PointP = Point*)进行排序,附加的是比较函数和排序,问题是什么都没有发生,也没有发生排序。

int compareByAngleP(const void* elem1,const void* elem2) {
    PointP point1 = (PointP) elem1;
    PointP point2 = (PointP) elem2;
    if (abs(point1->getAngle() - point2->getAngle())>0.001)
    {
        return point1->getAngle() - point2->getAngle();
    }
    return  point1->getY() - point2->getY();
}

void sortArrayP(PointP* array, int size) {
    qsort(array,size, sizeof(PointP), compareByAngleP);
}
4

4 回答 4

4

我的建议是忘掉std::qsort,喜欢平淡的老std::sort。不像std::qsort它是类型安全的,并且在大多数实现中要快得多。

std::sort(array, array+size, compareByAngleP);

并摆脱void*比较功能中的实际类型。

此外,如果您使用的是 C++11 并且该数组只是本地的:

std::sort(std::begin(array), std::end(array), compareByAngleP);

或者甚至更好地使用一个std::vector或其他最合适的容器。

std::vector<Point> array { ... };
std::sort(array.begin(), array.end(), compareByAngleP);

笔记

您可能需要修改比较函数,以便在第一个参数小于第二个参数时返回真。(或简单地operator <为 Point 实现)。

参考

http://en.cppreference.com/w/cpp/algorithm/sort

http://en.cppreference.com/w/cpp/container/vector

于 2012-12-18T14:53:34.973 回答
2

qsort您在使用和比较功能时存在几个问题。

  1. qsort将使用memcpy(或类似的)重新排序数组的元素。如果您的Point类型具有复制构造函数(或具有复制构造函数的成员),那么使用qsort它就是自找麻烦(它会导致未定义的行为)。

  2. 您的compareByAngleP函数不适合排序,因为它检查的关系不是传递的。例如,如果您有三个点A,BC, 都具有相同的Y坐标并分别具有角度10.000,10.00110.002, 那么compareByAngeP将指示A == BB == C, 但是A != C, 这可能会对排序功能造成严重破坏。

于 2012-12-18T15:04:04.833 回答
0

我认为如果您从比较函数返回 bool 而不是 int,那么会发生不同的事情。

于 2012-12-18T15:01:48.477 回答
0

Following qsort reference (http://en.cppreference.com/w/cpp/algorithm/qsort) 3rd parameter of qsort should be 'size of each element in the array in bytes' so instead

qsort(array,size, sizeof(PointP), compareByAngleP);

try

qsort(array,size, sizeof(PointP*), compareByAngleP);

Also you are implicity casting float to int (while returning value from comparing function). But:

(int)0.2 == 0
于 2012-12-18T14:59:17.187 回答