每当我想要比较C ++实体时,我只需实现operator<
。但是,阅读其他人的代码,我发现通过实施operator()
可以实现同样的目标。
两者有什么区别?应该何时使用这些运营商?
答案 0 :(得分:5)
operator<
是定义比较运算符的规范方法:
struct A { /* some members */ };
struct B { /* some members */ };
// comparison operator
bool operator<(const A&, const B&);
这为您提供了常规用法:
int main()
{
A a;
B b;
const bool result = (a < b);
}
你看到的是创建仿函数的人;也就是说,整个班级,唯一目的是包装比较。为了使这些看起来像调用代码的函数,他们使用operator()
:
struct A { /* some members */ };
struct B { /* some members */ };
// comparison functor
struct comparator
{
bool operator()(const A&, const B&);
};
这使您在与我之前的示例等效的代码中使用较少的传统用法:
int main()
{
A a;
B b;
comparator c;
const bool result = c(a,b);
}
但是,你不会将它用于此。函数用于传递算法(特别是在通用代码中)。它们还具有能够保持状态的额外好处,因为您可以使用构造函数参数。这使它们比简单的函数指针更灵活。
int main()
{
std::vector<A> a(5);
B b;
comparator c;
std::sort(a.begin(), a.end(), c);
// or, simply:
std::sort(a.begin(), a.end(), comparator());
// all more easily extensible than:
std::sort(a.begin(), a.end(), &someComparisonFunction);
}