c++ - 尝试将 c++ qsort 与内联函数一起使用

标签 c++ lambda c++11 qsort

我正在尝试为 qsort 的比较器创建一个内联函数 - 如下所示:

function<int(int,int)> comparesort = [smarkers, emarkers, strSearch] (int *arg1, int *arg2) { return 0; };
qsort(sortptrs, nKeywords, sizeof(int), comparesort);

它给我这个错误

IntelliSense:不存在从“std::tr1::function”到“int (__cdecl *)(const void *, const void *)”的合适转换函数

好的 - 我把它改成了这个

auto comparesort = [sortptrs, smarkers, emarkers, strSearch] (int arg1, int arg2)
{
    int a = 0;
    .
    .
    .
    return a;
};

std::sort(sortptrs, sortptrs + nKeywords, comparesort);

它给出了一个错误:

错误 C3499:指定为具有 void 返回类型的 lambda 无法返回值

[编辑于 7 月 30 日下午 3:55]

我实际上需要一个指针排序 - 我有一个单词的开始和结束字节数组(在从 VB.Net 托管代码传入的字符串中找到)。我还有一个包含“1,2,3...”的指针数组,我需要对指针进行排序。

我似乎无法使用 std::sort 做到这一点,所以我实现了自己的 shell 排序...

最佳答案

qsort的签名采用 int(*)(const void*, const void*) 类型的函数指针.你试图给它一个 function<int(int, int)> ,它不是一个函数指针,而是一个封装了某些东西的对象(可能是一个函数 ptr,可能是一个仿函数),它可以作为 int(int, int) 调用。 (注意它不会有正确的签名,即使它是一个函数指针)。

qsort基本上是一个与 c 向后兼容的遗留函数。 在 C++ 中,我强烈建议忘记它并使用 std::sort相反:

auto comparesort = [smarkers, emarkers, strSearch] (const  int& arg1, const int& arg2) { return false; }; 
//directly store the lambda, avoiding the overhead of creating a `function<...>`
std::sort(sortptrs, sortptrs + nKeywords, comparesort);

关于c++ - 尝试将 c++ qsort 与内联函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713126/

相关文章:

c++ - 如何将 `std::vector` 成员变量 move 到方法的调用者?

c++ - 多态性 : Accessing inherited class variable

c++ - 有效地等待线程池中的所有任务完成

c# - 如何在 Windows 中打开/关闭 radio ?

c++ - 如何转换格式化字符串 HH :MM:SS to seconds in C++

c++ - 如何使用 Boost Hana 删除元编程递归

c - Haskell 中的高阶函数到底能做什么扩展 C 不能做的事情?

SQL返回连续记录

c++ - 有状态元编程中使用的模板函数/类隐式实例化规则

c++ - 如何在多重继承下继承一个基类的所有typedef?