模板化C++的等效C代码

Equivalent C code for templatized C++

本文关键字:代码 C++      更新时间:2023-10-16

这是我刚刚写的一个气泡排序函数:

template <class iter>
void bubble_sort(iter begin, iter end, int (*cmp)(void *, void *)) {
    bool didSwap;
    do {
        didSwap = false;
        for (iter temp = begin; (temp + 1) != end; ++temp)
            if ((*cmp)((temp+1), (temp))) {
                std::swap(*(temp+1), *temp);
                didSwap = true;
            }
        --end;
    } while (didSwap);
}

我想知道是否有可能在C中完成这样的操作。只要不与deque、vector、list等标准stl容器一起使用,比较函数就可以正常工作。但我担心的是iter beginiter end。既然你不能用void做指针运算,我该怎么做呢?有可能做到这一点吗?

您可以按照qsort函数的方式执行此操作,并传递数组的类型和大小的大小,以及指向数组开头的指针。

void bubble_sort(void* begin, size_t num, size_t size, int (*cmp)(void*,void*));

使用C当然可以获得等效的结果。事实上,在引擎盖下,您拥有的大多数代码都将使用C语言的基本原理,例如使用指针。

至于iter begin, iter end,它们本质上是C指针。C中有一个名为qsort的内置例程,其函数签名与您提供的代码类似。

这是有效的:

void bubble_sort(void *array, size_t num, size_t ptr_size, int (*cmp)(void *, void *)) {
    bool didSwap;
    do {
        didSwap = false;
        for (size_t temp = 0; (temp+1) < num; ++temp)
            if ((*cmp)((bool *)(array+(temp*ptr_size)), (bool *)(array+(-~temp*ptr_size)))) {
                std::swap(*(bool *)(array+(temp*ptr_size)), *(bool *)(array+(-~temp*ptr_size)));
                didSwap = true;
            }
        --num;
    } while (didSwap);
}

尽管有人提到了一些关于向char *选角,然后递增的内容,但char *并不能很好地实现这一点,只有bool

这就是我主要调用函数的方式:

bubble_sort(arr, 20, sizeof(int), (int (*)(void *, void *))compare);