了解如何将cmp(比较器函数)用作另一个函数的参数

时间:2019-01-30 13:03:40

标签: c# c

这已经使我困惑了一段时间,不确定是否有人可以理解我要开车去的地方

来源: 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的情况下执行比较器功能?

1 个答案:

答案 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