如果我已经重载了,我们需要重载==运算符吗<? [duplicate]

问题描述 投票:0回答:2

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

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

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

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

temp.remove(tmpobj)

现在,这是我的问题

  1. 我假设我需要重载 == 运算符。请告诉我 如果我不需要并且默认的 == 是否有效。我不知道 关于那个。我知道如果我没有任何基于 STL 的东西,它也会起作用 会员
  2. 我已经有了< operator overloaded. Yet, I think "==" operator needs to be provided. Is this right. One argument can be, we can determine "==" as two calls to '<' operator like

    如果(一个< b || b < a) return false else return true;

或者这是否没有完成,因为进行 2 次调用效率低下,或者是否有其他原因。

c++ operator-overloading
2个回答
1
投票

n3337 23.3.5.5

void remove(const T& value);

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

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

因此,您需要重载

operator ==
或谓词。


1
投票

没有默认值

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

如果你的类的所有可能值一起代表一个具有“全序”数学属性的集合,那么你可以用

operator==
来实现
operator<
。它不一定是最有效的方法,但 C++ 不假设它的主要原因是,一般来说,它不假设任何有关不同重载运算符应如何相互关联的信息。并非所有类型都必然表示全序集。无论好坏,C++ 都允许您使用
operator<
来表示偏序。

© www.soinside.com 2019 - 2024. All rights reserved.