1

这是我刚刚写的冒泡排序函数:

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 中完成。比较函数可以正常工作,只要它不与标准 stl 容器(如双端队列、向量、列表等)一起使用。但它是我iter beginiter end我很担心。既然你不能用 void 做指针运算,我怎么能做到这一点?是否有可能做到这一点?

4

3 回答 3

1

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

void bubble_sort(void* begin, size_t num, size_t size, int (*cmp)(void*,void*));
于 2013-08-23T16:46:55.970 回答
0

您当然可以使用C. 事实上,在您拥有的大部分代码的底层,它们都将使用 C 语言基础知识,例如使用指针。

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

于 2013-08-23T16:49:20.957 回答
0

这有效:

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.

这就是我在 main 中调用函数的方式:

bubble_sort(arr, 20, sizeof(int), (int (*)(void *, void *))compare);
于 2013-08-23T17:14:15.533 回答