如果我有重载<,我们是否需要重载 == 运算符?

Do we need to overload == operator if I have overloaded <?

本文关键字:重载 是否 我们 运算符 lt 如果      更新时间:2023-10-16

我有一个自定义类型A的对象(这个类有很多成员,它们是std::string、向量等,但没有原始指针)。

现在,我有一个a对象的列表。

A tmpobj;  
std::list<A> temp;

如果我想调用std::list::remove函数从列表中删除特定对象我正在尝试

temp.remove(tmpobj)

现在,以下是我的问题

  1. 我想我需要重载==运算符。请告诉我如果我不需要,如果默认的==会起作用。我不确定关于这个。我知道如果我没有任何基于STL的成员
  2. 我已经有<操作员过载。然而,我认为"=="需要提供操作员。这是对的吗。一个参数可以是,我们可以将"=="确定为对'<'的两个调用像这样的操作员

    如果(a<b||b<a)return false其他的返回true;

还是因为打两个电话效率低而没有这样做,或者还有其他原因吗。

n3337 23.3.5.5

void remove(const T& value);
template <class Predicate> void remove_if(Predicate pred);

效果:清除列表迭代器i引用的列表中满足以下条件的所有元素保持:*i==值pred(*i)!=false。仅使迭代器和对已擦除的的的引用无效元素。

因此,您需要重载的operator ==或谓词。

没有默认的operator==,所以不用担心。当编译器抱怨您的类没有operator==时,请实现它;-)

如果类的所有可能值一起表示一个具有"完全有序"数学性质的集合,则可以根据operator<实现operator==。这不一定是最有效的方法,但C++没有假设它的主要原因是,一般来说,它没有假设不同的重载运算符应该如何相互关联。并非所有类型都必须表示完全有序集。无论好坏,C++都允许您使用operator<来表示偏序。