运算符() 和运算符< 在C++中有什么区别?

What is the difference between operator() and operator< in C++?

本文关键字:运算符 什么 区别 C++ lt      更新时间:2023-10-16

每当我有c++实体,我想比较我只是实现operator<。然而,在阅读其他人的代码时,我发现同样可以通过实现operator()来实现。

两者的区别是什么?什么时候应该使用这些操作符?

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);
}