当我使用STL集时,我应该超载==操作员吗?

should I overload == operator when I use STL sets?

本文关键字:超载 操作员 我应该 STL 集时      更新时间:2023-10-16

当我想使用stl集将自定义对象存储在C 中时,有很多人说:您应该超载<运算符,但是如果我想使用find()方法,我认为它可以使用==操作员可以觉得能够获得一些指针?

标准库 set::find使用等价而不是 equality 查找值。您不需要提供operator ==,仅提供operator <(或您为set指定的任何比较操作员,std::less是默认值)。

如果您想知道如何找到元素,则假设默认排序find(x)将返回元素e,以下内容:

!( x < e || e < x )

,因为 std::set s需要一些指定a 严格弱排序的东西operator==不足以完成此任务。

您应仅在对课程有意义的情况下才能超载operator<。如果不是这样,最好是利用std::set作为第二个模板参数Compare的事实。因此,定义比较结构/功能并将其传递为集合的第二个参数是另一个通常可取的选项。

最终选项是为您的类型专门使用std::less。例如:

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

大多数标准库算法和容器使用操作员&lt;(或您提供的比较函数,以便如果LHS元素较小,则返回true)用于订购和搜索。与无序容器一起使用的算法将使用操作员==。

例如,std :: lower_bound()将返回第一个元素匹配从排序容器中匹配搜索标准的元素,如果找不到确切的术语,则最大的元素仍然小于搜索术语,或者是迭代器,如果没有元素大于您搜索的容器。它与操作员一起执行此操作,无需其他操作员。它按照(n)的顺序进行了许多操作。

其他比较操作员(>,> =,&lt; =),除了!= and ==以外,可以从运算符&lt;。

派生。

std ::但是,发现所使用的类型是相当的。您可以在此处找到参考:http://en.cppreference.com/w/cpp/algorithm/find

因此,如果您正在使用订购元素,则需要操作员。如果您正在使用无序的元素,则需要操作员==。

setmapmultisetmultimap仅使用您给出的比较函数,默认为 std::less,通常是 operator<。C 11中的无序版本具有更复杂的协议。他们不需要订单比较(他们是无序的),但是他们需要平等和哈希。

对涉及排序的所有标准算法也是如此(sortnth_elementlower_boundbinary_search等)。但是,find 算法(以及其他类似的算法,例如countsearchmismatch等,确实需要等效函数,默认为operator==。无标准库算法都需要。

由于您专门询问了find成员功能,因此答案是set和所有成员函数都可以通过订单比较来正常工作。

仍然,如果要定义operator<

,定义所有比较操作员几乎总是一个好主意。