我一直在听C++中的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?
我只是想知道是否有办法让我将一个额外的参数传递给我的比较器,然后在我的qsort函数中使用它?
例如,我有这两个比较器(一个按升序排列,另一个按降序排列)
qsort(entries, 3, sizeof(struct entry), compare_desc);
int compare_asc(const void *elem1, const void *elem2)
{
return strcmp(elem1.name.last, elem2.name.last);
}
int compare_desc(const void *elem1, const void *elem2)
{
return strcmp(elem2.name.last, elem1.name.last);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法,所以我可以做这样的事情:
int compare(const void *elem1, const void *elem2, const char *order)
{
if (strcmp(order, "asc") == 0)
return strcmp(elem1.name.last, elem2.name.last);
else if (strcmp(order, "desc") == 0)
return strcmp(elem2.name.last, elem1.name.last);
}
Run Code Online (Sandbox Code Playgroud)
我问的原因是我的排序程序必须接受开关,如果我有2个不同的开关(+ a,-a)分别用于升序和降序,那么我必须制作2个不同的比较器功能.如果我添加更多,它会变得更复杂.有没有办法改进这个程序的设计?
编辑:不允许全局和外部变量.
这个工作的关键原因是for_each()实际上并没有假设 它的第三个参数是一个函数.它只是假设它的第三个参数是可以用适当的参数调用的东西.适当定义的对象与 - 函数一样 - 并且通常比 - 更好.例如,内联类的应用程序操作符比内联作为函数指针传递的函数更容易.因此,函数对象通常比普通函数执行得更快.具有应用程序运算符(第11.9节)的类的对象称为类似函数的对象,仿函数或简称为函数对象.
[Stroustrup,C++第3版,18.4-最后一段]
我一直认为operator()调用就像在运行时调用函数一样.它与普通函数调用有什么不同?
为什么内联应用程序操作符比正常函数更容易?
它们如何比函数调用更快?
我有一段令我困惑的代码:
sort(data, data+count, greater<int>() );
Run Code Online (Sandbox Code Playgroud)
它是C标准库中的排序函数.我无法弄清楚第三个论点的含义.我已经读过它被称为二元谓词.这意味着什么?我如何制作自己的谓词?