当我使用STL集时,我应该重载==运算符吗?

时间:2012-12-20 03:58:52

标签: c++ stl

当我想使用STL集来存储C ++中的自定义对象时,有很多人说:你应该重载<运算符,但如果我想使用find()方法,我认为它可能会使用==运算符来实现它。任何人都可以给我一些指示?

4 个答案:

答案 0 :(得分:8)

标准库 set::find使用等价而不是等于来查找值。您无需提供operator ==,只需提供operator <(或您为set指定的任何比较运算符,std::less为默认值。

如果您想知道如何找到您的元素,那么假设默认排序find(x)将返回元素e

!( x < e || e < x )

答案 1 :(得分:1)

由于std::set需要指定严格弱排序的内容。 operator==不足以完成此任务。

只有在对班级有意义时才应重载operator<。如果没有,那么更好的是利用std::set作为第二个模板参数Compare的事实。因此,定义比较结构/函数并将其作为集合的第二个参数传递是另一个通常更可取的选项。

最后一个选项是为您的类型专门设置std::less。例如:

namespace std
{ 
    template <>
    struct less<CustomClass>
    { ... };
}

答案 2 :(得分:1)

大多数标准库算法和容器使用运算符&lt; (或者你提供的比较函数,如果lhs元素更小,它返回true)进行排序和搜索。与无序容器一起使用的算法将使用operator ==。

例如,std :: lower_bound()将从已排序的容器返回与搜索条件匹配的第一个元素,如果找不到确切的术语,则最大元素仍然小于搜索项,或者到最后的迭代器如果没有元素大于您搜索的元素,则为容器。它通过运算符&lt;执行此操作,不需要其他运算符。它按log(n)的顺序执行许多操作。

除了!=和==之外,每个其他比较运算符(&gt;,&gt; =,&lt; =)都可以从运算符&lt;。

派生。 但是,

std :: find要求使用的类型为Equality Comparable。您可以在此处找到参考:http://en.cppreference.com/w/cpp/algorithm/find

因此,如果您正在处理有序元素,则需要运算符&lt;。如果您正在使用无序元素,则需要operator ==。

答案 3 :(得分:0)

setmapmultisetmultimap仅使用您提供的比较函数,默认为std::less,通常为{{1} }}。 C ++ 11中的无序版本具有更复杂的协议;他们不需要订单比较(他们无序),但他们需要相等和哈希。

所有涉及排序的标准算法也是如此(operator<sortnth_elementlower_bound等。但是,binary_search 算法(以及其他类似算法,例如findcountsearch等确实需要相等的功能,默认为mismatch。没有标准库算法需要两者。

由于您专门询问了operator==成员函数,答案是find和所有成员函数只需订单比较即可正常工作。

但是,如果您要定义set,那么定义所有比较运算符几乎总是一个好主意。