我正在编写一个C ++类的链接列表,并试图弄清楚如何比较排序算法的两个泛型类型节点。在Java中,我将实现Comparable接口并使用compareTo()方法来确定哪个是“更大”或“更小”,让Collection的用户定义它。我可以使用C ++中的类似内容吗?我知道我可以覆盖“<”运营商,但我不知道这是否是“最好的”方法(主观的,我知道;实际上只是要求利弊,如果有另一种)来比较未知类型。
那么,是否还有其他选项可以在运行时比较未知类型,这些选项似乎比覆盖“<”更合适操作
编辑:更改了我需要覆盖的操作符。
答案 0 :(得分: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<()
,但允许用户使用不同的排序谓词。只要比较函数实现了strict weak order,就可以使用任何东西。
答案 1 :(得分:1)
是的,重载运算符(用于排序,您使用operator<
和operator==
)就是这样。它不是惯用的,你不需要标记界面(比如从特定的界面派生),通常不会这样做。
好处是,即使用户想要使用没有关系运算符的某种类型,他/她也可以通过提供运算符的自由函数重载来扩展其接口。
您可以使用任何其他方法(例如发明您自己的接口,例如函数int T::cmp(...)
,它将返回0/1 / -1,具体取决于参数的关系。但是,这有你不能重复使用其他课程的好处。
STL使用用户传递的函数对象对象来比较它所需要的东西,这是在相同数据上提供不同排序顺序所需的(例如,按姓氏与电话号码排序)。如果您不需要(或准备放弃此功能),您可以坚持使用operator<
。