这让我困惑了一段时间,不确定是否有人能理解我想要驾驶的东西
来源: 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# 中的委托(delegate)吗?
即将 cmp 传递到 buildHeap 会告诉 buildHeap 要实现什么函数,即比较器函数(符合以下签名:)
int(*cmp)(const void *,const void *)
是否有另一种方法可以教 buildHeap 在不传递 cmp 的情况下执行比较器功能?
最佳答案
buildHeap
的 cmp
参数是一个函数指针,它指向一个带有两个 const void *
的函数返回 int 的参数。 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]);
...
}
在 buildHeap
内部调用 cmp
实际上调用 compare_int
。
关于c# - 了解 cmp(比较器函数)如何用作另一个函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54441276/