c - 对多种类型使用 qsort()

标签 c

我想使用 C 的 qsort() 函数对每个具有不同类型的数组进行排序,如下所示:

int a[] = {1, 2, 3};
const char *b[] = {"foo", "bar", "bas"};
my_defined_type_t *c[100]; for (i=0; i<100; i++) { fill(c[i]); }

是否有必要为每个类型编写比较函数,如 intComparator()、stringComparitor()、myDefinedTypeComparitor() 并依次调用每个比较函数的 qsort,或者可以在 C 中完成这样的事情:

int myGrandUnifiedComparisonFunction(const void* a, const void* b) {

if *a, *b are integers: intComparatorCode;
if *a, *b are strings: stringComparitorCode;
if *a, *b are my_defined_type_t's: myDefinedTypeComparitorCode;
/* etc. */

}

最佳答案

有两个问题需要考虑:

1)信息问题

你的比较函数得到两个空指针。这只是一些位模式,可能意味着任何东西。 C 不附加任何信息,例如, float 或字符指针,因此如果您事先不知道,则无法判断某条数据是一个还是另一个。

就是说,您可以通过将数据包装在一个结构中以及一个枚举值来告诉您其中的内容,从而自行附加此信息。但从技术上讲,您不会比较 float 或字符指针,而是比较 float 和字符指针。像这样的东西:

enum { Float, String, MyType } typ;

typedef struct { 
    typ t;
    union {
       float f;
       char *s;
       myType mt;
    } wrappedData;

然后你可以只写一个比较wrappedData *的函数。 这正是每一种动态语言所做的。

然后,即使是您的大统一函数仍然必须适本地比较它们,也就是说,对每种类型进行不同的比较,所以您不会有太多收获。相反,您会将逻辑组合到一个实际上并不属于一起的函数中。

2)效率问题

虽然这可能不会打扰您,但解包指针并检查其类型将在每个比较操作中完成,这可能会大大增加排序的运行时间。

结论:

为了获得可疑的优势和显着的劣势(效率),您必须采取某种方式包装数据。不要这样做。

关于c - 对多种类型使用 qsort(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18824787/

相关文章:

多个分隔符的代码核算不起作用

c - 将数据写入.txt文件(C语言)

python - 如何分析组合的 python 和 c 代码

c++ - 使用 strlen 在 winapi 中获取字符串长度

c - 结构数据项的内存地址

c - 使用 MinGW : Undefined reference to '_imp__glewExperimental.' 的 GLEW 问题

c - 在 C 中对条件编译的枚举进行字符串化

c - C中指向结构和数组的指针

c - make : 'file' is up to date, 后面什么都不做

c - 以字节数组的形式访问结构体