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

时间:2012-08-31 10:47:24

标签: c++ operator-overloading

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

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

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

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

temp.remove(tmpobj)

现在,这是我的问题

  1. 我假设我需要重载==运算符。请告诉我 如果我不需要,如果默认==将工作。我不确定 关于那个。我知道如果我没有任何基于STL的话它会起作用 成员
  2. 我已经拥有了&lt;运算符重载。但是,我想 需要提供“==”运营商。这是正确的吗。一个论点可以 是的,我们可以将“==”确定为两次调用'&lt;'像

    这样的运算符

    if(a&lt; b || b&lt; a)     返回false 其他     return true;

  3. 或者这样做是不是因为它无法进行2次调用,或者还有其他原因。

2 个答案:

答案 0 :(得分:1)

n3337 23.3.5.5

void remove(const T& value);

template <class Predicate> void remove_if(Predicate pred);

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

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

答案 1 :(得分:1)

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

如果您的类的所有可能值一起表示具有“完全排序”的数学属性的集合,那么您可以使用operator==来实现operator<。它不一定是最有效的方式,但C ++不承担它的主要原因是它通常不会假设任何不同的重载运算符应该如何相互关联。并非所有类型都必然代表完全有序的集合。无论好坏,C ++允许您使用operator<来表示部分订单。