为什么我们将 Greater<string>() 传递给排序算法?

Shu*_*ain 2 c++ sorting algorithm

据我所知,Functor 基本上是一个重写operator (). 现在我必须首先实例化一个类,才能使用覆盖运算符。例如 -

class A {
    bool operator()(int a, int b) const {
        return a<b;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我想将其传递给排序函数时,我首先必须实例化它。

A instance;
sort(a.begin(),a.end(),instance);
Run Code Online (Sandbox Code Playgroud)

上面应该是正确的实现,因为我将一个函数传递给排序函数,它可以用于比较。为什么我必须instance()作为参数而不是实例传递。

另一件事:当我传递诸如greater()之类的东西时,我什至没有实例化该类!

Vla*_*cow 5

std::greater是一个函数对象,它是一个提供函数调用运算符的结构。

表达

std::greater<std::string>()
Run Code Online (Sandbox Code Playgroud)

调用结构体的构造函数并创建一个类型的临时对象std::greater<std::string>,可以在算法中调用该类型的函数调用运算符。

相对于您的函数对象定义

class A {
    bool operator()(int a, int b) const {
        return a<b;
    }
}
Run Code Online (Sandbox Code Playgroud)

要创建类的实例,您应该使用表达式

A()
Run Code Online (Sandbox Code Playgroud)

所以你可以写

std::sort( a.begin(), a.end(), A() );
Run Code Online (Sandbox Code Playgroud)

或者

A instance;
std::sort( a.begin(), a.end(), instance );
Run Code Online (Sandbox Code Playgroud)

考虑到这些代码片段的结果是等效的

std::cout << A()( 10, 20 ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

A instance;

std::cout << instance( 10, 20 ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • @ShubhamJain 是的,lambda 表达式是具有与 lambda 表达式主体相对应的函数调用运算符的类。 (2认同)