当我想使用STL集来存储C ++中的自定义对象时,有很多人说:你应该重载<运算符,但如果我想使用find()方法,我认为它可能会使用==运算符来实现它。任何人都可以给我一些指示?
答案 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)
set
,map
,multiset
和multimap
仅使用您提供的比较函数,默认为std::less
,通常为{{1} }}。 C ++ 11中的无序版本具有更复杂的协议;他们不需要订单比较(他们无序),但他们需要相等和哈希。
所有涉及排序的标准算法也是如此(operator<
,sort
,nth_element
,lower_bound
等。但是,binary_search
算法(以及其他类似算法,例如find
,count
,search
等确实需要相等的功能,默认为mismatch
。没有标准库算法需要两者。
由于您专门询问了operator==
成员函数,答案是find
和所有成员函数只需订单比较即可正常工作。
但是,如果您要定义set
,那么定义所有比较运算符几乎总是一个好主意。