问题描述
有人可以告诉我下面的代码是怎么回事:
int compareX(const void* a,const void* b)
{
Point *p1 = (Point *)a,*p2 = (Point *)b;
return (p1->x - p2->x);
}
我是从极客那里获取此代码的,极客是最接近的点对。任何人都可以通过逐行解释以更简单明了的方式向我解释类似的代码
此外,我也无法理解这段代码:
float bruteForce(Point P[],int n)
{
float min = FLT_MAX;
for (int i = 0; i < n; ++i)
for (int j = i+1; j < n; ++j)
if (dist(P[i],P[j]) < min)
min = dist(P[i],P[j]);
return min;
}
FLT_MAX
在这里有什么用?
解决方法
Point *p1 = (Point *)a,*p2 = (Point *)b;
此行正在同一行中初始化两个变量。喜欢
int a = 2,b = 3;
对于指针,*
保留在变量附近。以下内容将为您提供int *
和int
:
int *a = nullptr,b = 2;
这里的FLT_MAX有什么用?
所有内容都小于FLT_MAX
。因此可以安全地在第一次比较中检查最小数量。
FLT_MAX 是定义的常量here 如果使用逻辑来查找数组中所有点对之间的距离最小的点,则使用FLT_MAX设置变量min的想法是定义一个阈值极限值,该阈值可通过以下方法进行第一次比较: 1st 2点...
,如果要在调用standard qsort()
function(或其他类似方法)时作为比较器传递,则第一个代码段中的compareX
函数具有签名必需标准库提供的排序例程)。两个指针参数必须被指定为const void*
类型。
但是,当使用该函数时,代码实际上将传递指向Point
对象的指针,因此该函数必须首先明确地强制转换为这样,以便可以将它们取消引用。为了比较他们各自的x
成员。
注意:尽管在这里可以使用“ C-Style”强制转换,但许多人对此并不满意。使用static_cast
操作也许更符合“现代C ++”:
int compareX(const void* a,const void* b)
{
const Point *p1 = static_cast<const Point*>(a),*p2 = static_cast<const Point*>(b);
return (p1->x - p2->x);
}