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()之类的东西时,我什至没有实例化该类!
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)