2

每当我有想要比较的 C++ 实体时,我只需实现operator<. 但是,阅读其他人的代码,我发现通过实现operator().

两者有什么区别?什么时候应该使用这些运算符中的每一个?

4

1 回答 1

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

但是,您不会为此使用它。函子用于传递给算法(特别是在通用代码中)。它们还具有能够保持 state的额外好处,因为您可以使用构造函数参数。这使它们比简单的函数指针更灵活。

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);
}
于 2013-05-02T13:29:13.533 回答