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

标签 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# 中的委托(delegate)吗?

即将 cmp 传递到 buildHeap 会告诉 buildHeap 要实现什么函数,即比较器函数(符合以下签名:)

int(*cmp)(const void *,const void *)

是否有另一种方法可以教 buildHeap 在不传递 cmp 的情况下执行比较器功能?

最佳答案

buildHeapcmp 参数是一个函数指针,它指向一个带有两个 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/

相关文章:

c# - 根据TextWrapping 属性获取TextBlock 的行数?

c# - WPF 简单数据矩阵

c# - 背靠背 for 循环中的 int、short、byte 性能

c - 如何 "bypass"pthreads限制数量

c - 访问成员结构时出现无效数字

c - 可执行文件未运行

c - 寻找 `COMPILE_WPRINTF` 的定义

c# - 获取当前调用栈

c# - 如何防止我的游戏对象在尝试移动时一直旋转

c++ - '/'在一些头文件中的应用