如果我在C++类中实现operator <,我是否还应该实现其他比较运算符?(operator >和operator ==等)还是类以某种方式自动地从其他类中获取一个?我想使用STL std::sort和std::priority_queue使我的类具有可比性。(note:我的类有一个double成员,我将其用作排序键,因此它共享真实的的排序特征,如果我理解正确,它是一个严格的全序。)
operator <
operator >
operator ==
std::sort
std::priority_queue
double
v7pvogib1#
如果你只是想让你的类在使用std::sort和std::priority_queue时具有可比性,那么重载operator<就可以了。比较函数对象(即满足比较要求的对象),如果第一个参数小于第二个参数(即排序在第二个参数之前),则返回true。operator<函数确实满足要求。如果没有指定自定义比较器,operator<也会比较元素。template< class RandomIt > void sort( RandomIt first, RandomIt last );(1)1.使用operator<比较元素。这也适用于std::priority_queue。因此,在您的情况下,如果您的唯一要求是使用std::sort和std::priority_queue,则可以只使用operator<。但是,如果您要用std::greater颠倒顺序,则需要实现operator>。用于执行比较的函数对象。除非特殊化,否则调用类型T上的operator>。但是,如果你只打算使用std::greater来对类进行排序,你可以通过一个小技巧来做到这一点。如果你像operator>那样实现operator<,它会做预期的事情。
operator<
template< class RandomIt > void sort( RandomIt first, RandomIt last );
std::greater
operator>
fjnneemd2#
其他运算符不是自动生成的,尽管C20提供了operator<=>,它可以用来替换一整套比较运算符。然而,特别是为了使示例可订购标准库容器,* 只需要operator< *。甚至std::set does not require or use operator==。如果显式指定比较 predicate ,即使没有实现operator<的类型也可以排序。但是这里没有正式的接口可以实现。标准库模板类和算法只是使用ad-hoc多态性:如果提供了库代码实际使用的操作符 *,则该类型是可接受的。对于C20之前的C版本,实现其他比较(至少==)可能仍然是一个好主意-因为 * 其他 * 代码(可能是您自己的)可能想要使用它们。之所以会出现这样的乱象(乐观地说:如此多的灵活性)是因为这些运算符在概念上有许多不同的有意义的语义。因此,C类型double,float,int等)被称为total ordering,是最严格的解释。另一方面:
operator<=>
std::set
==
float
int
2条答案
按热度按时间v7pvogib1#
如果你只是想让你的类在使用
std::sort
和std::priority_queue
时具有可比性,那么重载operator<
就可以了。比较函数对象(即满足比较要求的对象),如果第一个参数小于第二个参数(即排序在第二个参数之前),则返回true。
operator<
函数确实满足要求。如果没有指定自定义比较器,operator<
也会比较元素。template< class RandomIt > void sort( RandomIt first, RandomIt last );
(1)1.使用
operator<
比较元素。这也适用于
std::priority_queue
。因此,在您的情况下,如果您的唯一要求是使用
std::sort
和std::priority_queue
,则可以只使用operator<
。但是,如果您要用
std::greater
颠倒顺序,则需要实现operator>
。用于执行比较的函数对象。除非特殊化,否则调用类型T上的
operator>
。但是,如果你只打算使用
std::greater
来对类进行排序,你可以通过一个小技巧来做到这一点。如果你像operator>
那样实现operator<
,它会做预期的事情。fjnneemd2#
其他运算符不是自动生成的,尽管C20提供了
operator<=>
,它可以用来替换一整套比较运算符。然而,特别是为了使示例可订购标准库容器,* 只需要
operator<
*。甚至std::set
does not require or use operator==。如果显式指定比较 predicate ,即使没有实现
operator<
的类型也可以排序。但是这里没有正式的接口可以实现。标准库模板类和算法只是使用ad-hoc多态性:如果提供了库代码实际使用的操作符 *,则该类型是可接受的。对于C20之前的C版本,实现其他比较(至少
==
)可能仍然是一个好主意-因为 * 其他 * 代码(可能是您自己的)可能想要使用它们。之所以会出现这样的乱象(乐观地说:如此多的灵活性)是因为这些运算符在概念上有许多不同的有意义的语义。因此,C类型
double
,float
,int
等)被称为total ordering,是最严格的解释。另一方面: