Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义<;对于STL排序算法-运算符重载、函子还是独立函数?_C++_Sorting_Stl_Operator Overloading_Functor - Fatal编程技术网

C++ 定义<;对于STL排序算法-运算符重载、函子还是独立函数?

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

我有一个包含小部件类对象的stl::列表。它们需要根据Widget类中的两个成员进行排序

为了进行排序,必须定义一个比较两个小部件对象的小于比较器。似乎有很多方法可以做到这一点。根据我所能收集到的信息,一个人可以:

a。在类中定义比较运算符重载:

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