我应该使用函数还是无状态函子?

Jos*_*son 8 c++ stl function functor

这两段代码做同样的事情.如您所见,它将用于排序功能.哪个更好?我通常写后一个.但是我看到有些编码员会像前者那样做.

struct val_lessthan : binary_function<pair<string,int>, pair<string, int>, bool>
{
    bool operator() (const pair<string,int>& x, const pair<string,int>& y) const
    {
        return x.second < y.second;
    }
} val_lt;
Run Code Online (Sandbox Code Playgroud)

bool val_lt(const pair<string,int>& x, const pair<string,int>& y) 
{
    return x.second < y.second;
}
Run Code Online (Sandbox Code Playgroud)

将使用它像:

std::sort(wordvector.begin(), wordvector.end(), val_lt);
Run Code Online (Sandbox Code Playgroud)

jal*_*alf 7

你看到有些人喜欢第一个版本的原因是函子可以简单地内联。

当您将函子传递给 时std::sort,函子类型对于函数来说是已知的,因此要调用的确切函数在编译时也是已知的,并且可以简单地内联。

对于普通函数,std::sort真正看到的只是一个函数指针,而在编译时并没有说明它指向哪个函数。因此,除非编译器执行一些相当广泛的流分析以查看指针在此特定调用中的来源,否则无法内联。它肯定会在像你这样的小例子中进行优化,但是如果函子/函数指针是从其他地方作为函数参数传入的,例如,或者它是在传递给 之前从中间数据结构中读取的std::sort,那么,编译器可能无法内联函数指针版本,因此最终会变慢。


Gre*_*ill 5

第一个称为函数对象,如果需要将任何上下文信息传递给比较函数,则它非常有用.独立函数只能获得x并且y没有机会携带任何上下文.

在上面的具体实例中,写入比较函数的两种方式大致相同.