我正在尝试使用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);
}
答案 0 :(得分: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);
您可能需要修改比较函数,以便在第一个参数小于第二个参数时返回true。 (或简单地为Point实现operator <
。
答案 1 :(得分:2)
使用qsort
和比较功能时存在一些问题。
qsort
将使用memcpy
(或类似)来重新排序数组的元素。如果您的Point
类型具有复制构造函数(或具有复制构造函数的成员),则在其上使用qsort
会导致问题(导致未定义的行为)。
您的compareByAngleP
函数不适合排序,因为它检查的关系不可传递。
例如,如果您有三个点A
,B
和C
,则所有点都具有相同的Y
坐标,并且分别具有角度10.000
,{{1然后10.001
表示10.002
和compareByAngeP
,但是A == B
,这可能会对排序功能造成严重破坏。
答案 2 :(得分:0)
关于qsort引用(http://en.cppreference.com/w/cpp/algorithm/qsort)qsort的第三个参数应该是'数组中每个元素的大小,以字节为单位',而不是
qsort(array,size, sizeof(PointP), compareByAngleP);
试
qsort(array,size, sizeof(PointP*), compareByAngleP);
另外,你很难将float转换为int(同时从比较函数返回值)。但是:
(int)0.2 == 0
答案 3 :(得分:0)
我认为如果从Compare函数返回bool而不是int,那么就会发生不同的事情。