【问题标题】:Equivalent C code for templatized C++模板化 C++ 的等效 C 代码
【发布时间】: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 beginiter end 我很担心。既然你不能用 void 做指针运算,我怎么能做到这一点?可以这样做吗?

【问题讨论】:

  • qsort() 在标准 C 中可用,并且已经使用了 几十年,这会让我相信你的问题的答案只是“是的,它可能,因为它已经成为现实”。并回答您如何使用void* 进行指针运算。你没有。你编写你的函数来要求一个“项目大小”,并通过数学使用你的void*中的unsigned char*
  • 哇,我写排序函数的时候怎么忘记了qsort?
  • C 会很好,但我想我现在已经可以做到了,因为我看到了 qsort。但无论如何我想看看你的答案。我确实提到了“等效的 C 代码......”
  • 实际上,没关系,我有点忽略了您想将内容“移植”到 C。抱歉。
  • 您已经达到了甜蜜点,您的代码只能使用 C++ 编译器进行编译,并可能生成更多代码 (template),但会付出 C 版本的代价 (除非整个函数本身是内联的,否则不可能内联比较),设法在几行中获得两全其美......

标签: c++ c templates iterator void-pointers


【解决方案1】:

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

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

【讨论】:

  • @Smac89 我输入了语法,以及 qsort 的链接,该链接通过示例解释了用法...
  • @Smac89,只是为了让您知道如何增加它以到达下一个元素,而不是中途。
【解决方案2】:

您当然可以使用C 获得相同的结果。事实上,您拥有的大部分代码都将使用 C 语言基础知识,例如使用指针。

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

【讨论】:

    【解决方案3】:

    这行得通:

    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);
    

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2011-03-10
      • 2011-12-18
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多