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

时间:2012-07-29 21:30:45

标签: 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 pm]

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:4)

qsort是旧的C API,它直接获取函数指针。你不能将它与lambdas等其他东西一起使用。相反,请使用std::sort