定义<用于STL排序算法 - 运算符重载,仿函数还是独立函数?

And*_*ndy 10 c++ sorting stl operator-overloading functor

我有一个包含Widget类对象的stl :: list.它们需要根据Widget类中的两个成员进行排序.

为了使分类工作,必须定义一个比较两个Widget对象的比较器.似乎有无数种方法可以做到这一点.从我可以收集到的,人们可以:

一个.在类中定义比较运算符重载:

bool Widget::operator< (const Widget &rhs) const
Run Code Online (Sandbox Code Playgroud)

湾 定义一个带有两个小部件的独立函数:

bool operator<(const Widget& lhs, const Widget& rhs);
Run Code Online (Sandbox Code Playgroud)

然后让Widget类成为它的朋友:

class Widget {
    // Various class definitions ...
    friend bool operator<(const Widget& lhs, const Widget& rhs);
};
Run Code Online (Sandbox Code Playgroud)

C.定义一个仿函数,然后在调用sort函数时将其作为参数包含在内:

class Widget_Less :
public binary_function<Widget, Widget, bool> { 
    bool operator()(const Widget &lhs, const Widget& rhs) const;
};
Run Code Online (Sandbox Code Playgroud)

有谁知道哪种方法更好?特别是我有兴趣知道我是否应该做1或2.我搜索了Scott Meyer的书"有效STL",但遗憾的是它没有任何关于此的说法.

谢谢您的回复.

Soa*_*Box 11

如果您只是将两个小部件相互比较,请使用成员operator <.如果您要将Widget与其他内容进行比较,请定义一个全局operator <(两个参数版本,可选地是Widget类的朋友,但这是一个单独的问题.

如果你正在做一些不那么正统的东西,你真的只想要的Functor.如果"小于"比较在小部件的上下文中没有意义,请选择仿函数.在这种情况下,operator <可能会令人困惑.当然,仿函数仍然需要提供一个排序,但仅仅因为它是一个排序并不意味着它是一个"小于"的操作.(例如,按人口排序状态对于算子来说可能更好operator <.

  • +1.**最重要的**运算符重载规则如果没有意义,就不要这样做. (4认同)