这是compareX和compareY
struct Point
{
long long int x, y;
};
long long int compareX(const void* a, const void* b)
{
Point *p1 = (Point *)a, *p2 = (Point *)b;
return (* (long long int * )(p1->x - p2->x));
}
long long int compareY(const void* a, const void* b)
{
Point *p1 = (Point *)a, *p2 = (Point *)b;
return (* (long long int * )(p1->y - p2->y));
}
这是调用compareY的qsort
long long int stripClosest(Point strip[], long long int size, long long int
d)
{
long long int min = d;
qsort(strip, size, sizeof(Point), compareY);
for (long long int i = 0; i < size; ++i)
for (long long int j = i+1; j < size && (strip[j].y - strip[i].y) < min;
++j)
if (dist(strip[i],strip[j]) < min)
min = dist(strip[i], strip[j]);
return min;
}
这是调用compareX的qsort
long long int closest(Point P[], long long int n)
{
qsort(P, n, sizeof(Point), compareX);
return closestUtil(P, n);
}
我不知道为什么会这么说“注意:候选函数不可行:没有已知的从'long long(const void *,const void )'转换为'int( _Nonnull) (const void *,const void *)'for 4th argument“和”error:没有匹配函数来调用'qsort'“
答案 0 :(得分:2)
函数qsort要求相应参数的函数类型为
int ( const void *, const void * )
这也是指针的魔力
* (long long int * )(p1->x - p2->x)
不清楚,导致未定义的行为。
因此,例如,函数compareX
可以通过以下方式定义
int compareX(const void *a, const void *b)
{
const Point *p1 = static_cast<const Point *>(a);
const Point *p2 = static_cast<const Point *>(b);
return (p2->x < p1->x) - (p1->x < p2->x);
}
或者它可以用“C”链接声明
extern "C" int compareX(const void *a, const void *b)
{
const Point *p1 = static_cast<const Point *>(a);
const Point *p2 = static_cast<const Point *>(b);
return (p2->x < p1->x) - (p1->x < p2->x);
}
考虑到在C ++中,您可以将标准算法std::sort
与比较函数一起使用。
这是一个演示程序,它显示了使用标准C函数qsort
和标准C ++算法std::sort
的两种方法。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstdlib>
struct Point
{
long long int x;
long long int y;
};
int compareX(const void *a, const void *b)
{
const Point *p1 = static_cast<const Point *>(a);
const Point *p2 = static_cast<const Point *>(b);
return (p2->x < p1->x) - (p1->x < p2->x);
}
int main()
{
{
Point p[] = { { 2, 1 }, { 1, 1 }, { 3, 1 } };
qsort(p, sizeof(p) / sizeof(*p), sizeof(Point), compareX);
for (const auto &item : p)
{
std::cout << "(" << item.x << ", " << item.y << ") ";
}
std::cout << std::endl;
}
{
Point p[] = { { 2, 1 },{ 1, 1 },{ 3, 1 } };
std::sort( std::begin( p ), std::end( p ),
[](const Point &a, const Point &b)
{
return a.x < b.x;
});
for (const auto &item : p)
{
std::cout << "(" << item.x << ", " << item.y << ") ";
}
std::cout << std::endl;
}
return 0;
}
程序输出
(1, 1) (2, 1) (3, 1)
(1, 1) (2, 1) (3, 1)