【发布时间】:2013-08-23 16:42:56
【问题描述】:
这是我刚刚写的冒泡排序函数:
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 容器(例如 deque、vector、list 等)一起使用。但它是iter begin 和 iter end 我很担心。既然你不能用 void 做指针运算,我怎么能做到这一点?可以这样做吗?
【问题讨论】:
-
qsort()在标准 C 中可用,并且已经使用了 几十年,这会让我相信你的问题的答案只是“是的,它可能,因为它已经成为现实”。并回答您如何使用void*进行指针运算。你没有。你编写你的函数来要求一个“项目大小”,并通过数学使用你的void*中的unsigned char*。 -
哇,我写排序函数的时候怎么忘记了qsort?
-
C 会很好,但我想我现在已经可以做到了,因为我看到了 qsort。但无论如何我想看看你的答案。我确实提到了“等效的 C 代码......”
-
实际上,没关系,我有点忽略了您想将内容“移植”到 C。抱歉。
-
您已经达到了甜蜜点,您的代码只能使用 C++ 编译器进行编译,并可能生成更多代码 (
template),但会付出 C 版本的代价 (除非整个函数本身是内联的,否则不可能内联比较),设法在几行中获得两全其美......
标签: c++ c templates iterator void-pointers