1

谁能告诉我以下代码发生了什么:

int compareX(const void* a, const void* b)  
 {  
    Point *p1 = (Point *)a, *p2 = (Point *)b;  
    return (p1->x - p2->x);  
 }

我从 geeks for geeks 那里获取了这段代码,这是最接近的一对点。任何人都可以通过逐行解释以更简单和容易的方式向我解释类似的代码

另外,我也无法理解这段代码:

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

4

3 回答 3

1
Point *p1 = (Point *)a, *p2 = (Point *)b;

此行正在初始化同一行中的两个变量。像

int a = 2, b = 3;

对于指针,*保存在变量附近。以下将为您提供 anint *和 an int

 int *a = nullptr, b = 2;

https://cdecl.org


FLT_MAX 在这里有什么用?

一切都小于FLT_MAX。因此,在第一次比较中检查最小数量是安全的。

于 2020-08-26T16:10:12.813 回答
1

FLT_MAX是这里定义的一个常量 ,如果用于查找数组中所有点对之间距离最小的点的逻辑,则使用 FLT_MAX 设置变量 min 的想法是定义一个可以超过的阈值限制值通过第 2 点的第 1 次比较...

于 2020-08-26T16:10:46.750 回答
1

如果要在调用标准函数(或标准库提供的其他类似排序例程)中将其作为比较器传递,则compareX第一个代码片段中的函数具有所需的签名。两个指针参数必须作为类型给出。qsort()const void*

但是,当使用该函数时,代码实际上将传递指向Point对象的指针,因此该函数必须首先将它们显式转换为这样,以便可以取消引用它们以便比较它们各自的x成员。

注意:虽然在这里使用“C-Style”转换可以工作,但许多人会不赞成这种用法。使用操作可能更符合“现代 C++” static_cast

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);
}
于 2020-08-26T16:17:00.313 回答