C++ 定义<;对于STL排序算法-运算符重载、函子还是独立函数?
我有一个包含小部件类对象的stl::列表。它们需要根据Widget类中的两个成员进行排序 为了进行排序,必须定义一个比较两个小部件对象的小于比较器。似乎有很多方法可以做到这一点。根据我所能收集到的信息,一个人可以: a。在类中定义比较运算符重载:C++ 定义<;对于STL排序算法-运算符重载、函子还是独立函数?,c++,sorting,stl,operator-overloading,functor,C++,Sorting,Stl,Operator Overloading,Functor,我有一个包含小部件类对象的stl::列表。它们需要根据Widget类中的两个成员进行排序 为了进行排序,必须定义一个比较两个小部件对象的小于比较器。似乎有很多方法可以做到这一点。根据我所能收集到的信息,一个人可以: a。在类中定义比较运算符重载: bool Widget::operator< (const Widget &rhs) const bool小部件::operator
bool Widget::operator< (const Widget &rhs) const
bool小部件::operator<(const小部件和rhs)const
b。定义一个包含两个小部件的独立函数:
bool operator<(const Widget& lhs, const Widget& rhs);
bool算子a。B对我来说,两个小部件的比较运算符不是直观的事情。现在我看不出它能做什么。
此外,如果此功能不直观,一旦您需要一个新的比较运算符,在这种情况下您可以做什么
我更喜欢functor。它们在性能上应该是相同的,但它们之间还有其他区别:
- 前两种方法省去了显式指定比较器的麻烦,并且可以轻松地与其他操作一起使用,这些操作可能定义得很差,不允许显式指定比较器
- 只有函子允许使用其他数据进行比较。例如,如果要比较
int
s,可以创建一个比较,比较它们与第三个点P的距离,P是函子实例的一个成员
- 函子通常不太容易阅读(对于那些不熟悉C++的人来说)
注意,您不需要继承binary_操作符
,尽管它确实提供了一些不错的typedef
s.如果您只是比较两个小部件,那么在大多数情况下使用一个成员操作符。和b。都是一样的。所以真正的问题是,何时使用a/b,何时使用c
答案是:如果“小于”对您的对象有明确意义,请使用a或b。如果您的类是一个数字,那么使用无论它是否直观都无关紧要,并且适用于定义比较器的任何方法。您所需要的只是一个合理的比较。我的意思是,任何人都可以比较某些实体(浮点、整型、字符串、复数、长数…),而有些实体则不能-在本例中,我使用的是比较函数/functor,例如WidgetByXCoordinateComparator、WidgetByNameComparator、,一般来说,只有当所有人都能直观地理解运算符重载时,才使用运算符重载是一种良好的做法。运算符重载最重要的规则是,如果没有意义就不要这样做。谢谢您的评论。我没有意识到函子是否需要二进制_运算符才能工作-无论如何,我总是在我的程序中包含它。如果有效STL第46项正确,您对性能的评论可能不正确(函子中的函数可以内联)。看起来我遗漏了有效STL的第46项。它说更喜欢函子而不是成员函数,因为它可以更容易地内联。我知道做选项A(类的成员函数)更容易一些。但是你应该把这个论点和什么作比较呢?一个简单的返回(x
class Widget {
// Various class definitions ...
friend bool operator<(const Widget& lhs, const Widget& rhs);
};
class Widget_Less :
public binary_function<Widget, Widget, bool> {
bool operator()(const Widget &lhs, const Widget& rhs) const;
};