这已经使我困惑了一段时间,不确定是否有人可以理解我要开车去的地方
来源: https://www.oreilly.com/library/view/algorithms-in-a/9780596516246/ch04s06.html
我正在尝试弄清楚传递cmp作为buildHeap的参数是什么
buildHeap (ar, cmp, n);
这本书似乎将cmp描述为比较器功能(How does the compare function in qsort work?)并给出了
static void buildHeap (void **ar, int(*cmp)(const void *,const void *), int n) {
我有权说
int(*cmp)(const void *,const void *)
从本质上讲C与C#中的委托等效吗?
即将cmp传递到buildHeap可以告诉buildHeap要实现的功能是比较器功能(适合于:)
int(*cmp)(const void *,const void *)
我是否可以通过另一种方式教buildHeap在不传递cmp的情况下执行比较器功能?
答案 0 :(得分:1)
cmp
的{{1}}参数是函数指针,它指向具有两个返回初始值的buildHeap
参数的函数。 const void *
可以使用此函数指针来调用有问题的函数以比较两个项目。
例如,如果要比较两个整数,则可以实现如下功能:
buildHeap
然后,您将int compare_int(const void *p1, const void *p2)
{
const int *a = p1;
const int *b = p2;
if (*a > *b) {
return -1;
} else if (*a < *b) {
return 1;
} else {
return 0;
}
}
作为第二个参数传递给compare_int
,即buildHeap
。然后可以在buildHeap(arr, compare_int, n)
中的某个位置适当地调用此函数:
buildHeap
在void buildHeap (void **ar, int(*cmp)(const void *,const void *), int n) {
...
cmp(ar[x], ar[y]);
...
}
内调用cmp
实际上会调用buildHeap
。