尝试使用带有内联函数的c ++ qsort

szl*_*any 1 c++ lambda qsort c++11

我正在尝试为qsort的比较器创建一个内联函数 - 类似这样:

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

它给了我这个错误

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);
Run Code Online (Sandbox Code Playgroud)

并且它给出了一个错误:

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

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

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

似乎我不能用std :: sort这样做,所以我实现了自己的shell排序......

Gri*_*zly 9

签名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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*k B 5

qsort是直接采用函数指针的旧 C API。您不能将它与其他任何东西(例如 lambda)一起使用。相反,使用std::sort.

  • 几乎是对的——它也需要一个非捕获 lambda。尽管如此,“std::sort”效率更高。 (4认同)