2012-07-29 17 views
0

我试图创造一个比较器对快速排序的内联函数 - 是这样的:试图用C++快速排序与内联函数

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

它给我这个错误

智能感知:没有合适的从 “的std :: TR1 ::功能” 为 “int(__cdecl *)(常量无效*,常量无效*)” 存在

确定转换功能 - 我把它改成这个

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

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

和它给了一个错误:

错误C3499:已指定具有void返回类型不能[上7/30 15:55编辑]

返回一个值

拉姆达

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

似乎没有我能做到这一点用的std ::排序所以我实现我自己的希尔排序...

+1

'qsort'?怎么样使用'std :: sort'? – 2012-07-29 21:35:35

+0

@BoPersson - 我试过std :: sort - 函数的返回类型有问题 – szlamany 2012-07-29 22:46:09

回答

4

qsort是老C API直接取一个函数指针。您不能将其与其他任何其他产品(如lambda)一起使用。相反,使用std::sort

+1

几乎没错 - 它也需要一个非捕获lambda。不过,'std :: sort'更有效率。 – MSalters 2012-07-29 22:10:25

+0

@msalters - 我很难得到lamdba函数的返回类型 - 我发布了更多的代码顶部 – szlamany 2012-07-29 22:44:24

+0

@szlamany:您的lambda捕获。一个非捕获的lambda以'[]'开始,一个空的捕获列表。 – MSalters 2012-07-30 07:39:23

7

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

@szlamany:它究竟如何不工作? – Grizzly 2012-07-29 22:13:36

+0

好的 - 我在OP – szlamany 2012-07-29 22:22:33

+0

上发布了更多细节,您是否看到我尝试过的新代码?我把它贴在OP的最上面... – szlamany 2012-07-29 22:42:08

0

我确实需要一个指针类型的 - 我有字的开始和结束的字节数组(从传入的一个字符串中发现VB.Net托管代码)。

我也有一个包含“1,2,3 ...”的指针数组,我需要对指针进行排序。

似乎没有我能做到这一点用的std ::排序所以我实现我自己的希尔排序...

+0

你的描述你需要的是一种混乱,所以我不是100%确定你的意思,但我敢肯定你可以用'std :: sort'实际做到这一点,给定一个适当的函子和迭代器适配器。但是你知道,如果你事先告诉我们你究竟想要做什么,会更容易回答你的问题/解决你的问题...... – Grizzly 2012-07-30 20:14:11

+0

我在十年内没有编码自己的shell排序 - 找到了C++ QSORT和在做一个比较器功能时很困难。被告知我需要使用std :: sort - 试过了。我需要做的不仅仅是检查HIGH/LOW比较 - 所以我认为把对象放到[]的时候会让我像JAVASCRIPT中的闭包一样 - 所以我可以访问我的数组和需要排序的“文本区域” 。这里是C++的新手 - 所以我正在为诸如指针和参数定义之类的简单东西而努力。我想这就是C++中的“捕获”。明天我会收到一封邮件。谢谢! – szlamany 2012-08-01 15:35:03

+0

我只是想说,如果你已经在你的问题中解释了比较应该如何工作,你可能会得到一个工作解决方案作为答案,没有任何澄清的需要。如果你提到缺乏知识,这也有帮助。当你在你的问题中使用lambda时,我通常假设你知道如何使用它们。 – Grizzly 2012-08-01 22:06:01