如果我有一个排序算法,并且我想按结构的某个字段进行排序。我基本上是在寻找参数(在本例中为 sortBy
)能够确定是否比较 fieldOne 或 fieldTwo 的可能性,而无需不断检查要使用的正确字段。
void func(SomeType *arr, int length, int sortBy) {
int i;
for(int i = 0; i < length, i++) {
if(sortBy == 1) {
doSomethingTo(arr[i].fieldOne);
}
else if(sortBy == 2) {
doSomethingTo(arr[i].fieldTwo);
}
// etc
}
}
最佳答案
您可以观察标准 C qsort()
的内容做。它使用比较器函数对任何类型的任何数组进行排序:
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *v1, const void *v2));
如果v1
应该排序在v2
之前,则比较器函数返回负值;如果应该排序在v2
之后,则比较器函数返回正值;如果在此排序下值相等,则比较器函数返回零标准。请注意,需要比较两个值;将一个值与自己的肚脐进行比较是不够的。
在您的示例中,您似乎正在对固定类型进行排序。您可以使用 qsort()
,或者您可以借用比较器类型的想法,并使其适应您的排序:
void func(SomeType *arr, int length, int (*comparator)(const SomeType *v1, const SomeType *v2))
{
...
int cmp = comparator(&arr[i], &arr[j]);
...
}
您的比较器可能是:
static int compare_fieldOne(const SomeType *v1, const SomeType *v2)
{
if (v1->fieldOne < v2->fieldOne)
return -1;
else if (v1->fieldOne > v2->fieldOne)
return +1;
return 0;
}
如果需要进行更多比较,可以在 else if
子句后添加额外的测试对,将相等情况留到最后。
关于未知字段的代码复用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994985/