我想在 C 中使用快速排序,其函数签名为 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
,但我的比较函数的签名是 int (*compar)(const void *, const void*, const int)
,其中第三个参数在一次调用快速排序期间是常量。
作为说明,假设我想根据不同的范数(例如 L0、L1、L2 和 Linifinity 范数)对 vector 数组进行排序。它实际上是哪个范数,作为第三个参数传递给比较函数,但在调用 qsort 期间保持不变。是否可以以类似的形式进行作业
//Function declaration for parametric comparison
int cmp3(int* a_vec, int* b_vec, int x);
// Somewhere in main
int (*cmp2)(int, int);
cmp2 = cmp3(int*, int*, 2);//2 could mean L2 norm
能够调用类似的东西
qsort(a, 100, sizeof(a), cmp2);
我知道这行不通,但我希望它能让我知道我想要完成什么。而且也不可能进行不同的比较函数并调用 qsort,因为不同比较方式的数量太大。
最佳答案
这称为partial function application ,并且只能使用 C: 中的包装器来实现类似的效果:
int cmp3(int *a, int *b) {
return cmp2(a, b, 2);
}
如果您喜欢部分函数应用程序或者映射或纯函数,您可能需要研究函数式编程语言,例如 Haskell。
关于当一个参数不变时更改 C 中函数指针的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817243/