1

我正在为 C++ 类编写一个链表,并且一直试图弄清楚如何比较两个通用类型节点的排序算法。在 Java 中,我只需实现 Comparable 接口并使用 compareTo() 方法来确定哪个是“更大”或“更小”,让 Collection 的用户定义它。我可以使用 C++ 中的类似内容吗?我知道我可以覆盖“<”运算符,但我不知道这是否是比较未知类型的“最佳”方法(我知道是主观的;真的只是询问利弊是否有另一种)。

那么,是否有任何其他选项可以在运行时比较未知类型,这似乎比覆盖“<”运算符更合适?

编辑:更改了我需要覆盖的运算符。

4

2 回答 2

2

从我收集到的信息中,您有一个列表类模板,并且您想sort()在其上实现一个方法。我将遵循std::list<T>为此设置的示例:

template <typename T>
class List
{
public:
    // ...
    template <typename Compare>
    void sort(Compare compare) {
        // use compare(x, y) to determine if x is smaller than y
    }
    void sort() { this->sort(std::less<T>()); }
};

也就是说,您不会做出固定选择,而是默认使用operator<()但允许用户使用不同的排序谓词。只要比较函数实现严格的弱顺序,任何东西都可以使用。

于 2012-11-11T22:44:35.860 回答
1
  1. 是的,重载运算符(用于排序,您operator<可能会使用 and operator==)是一种方式。这是惯用的,您不需要标记接口(例如从特定接口派生),并且通常不会这样做。

    好消息是,即使用户想使用某种没有关系运算符的类型,他/她也可以通过提供运算符的免费函数重载来扩展他们的接口。

  2. 您可以使用任何其他方法(例如发明自己的接口,例如int T::cmp(...)根据参数关系返回 0/1/-1 的函数。但是,这有一个很大的缺点,即您将无法重用别人的课。

  3. STL 使用用户传递的函数对象对象来比较它需要什么,这是对相同数据提供不同排序顺序(例如,按姓氏与电话号码排序)所需的。如果你不需要这个(或者准备放弃这个功能),你可以坚持使用operator<.

于 2012-11-11T22:46:03.290 回答