当我使用STL集时,我应该超载==操作员吗?
should I overload == operator when I use STL sets?
当我想使用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
因此,如果您正在使用订购元素,则需要操作员。如果您正在使用无序的元素,则需要操作员==。
set
, map
, multiset
和 multimap
仅使用您给出的比较函数,默认为 std::less
,通常是 operator<
。C 11中的无序版本具有更复杂的协议。他们不需要订单比较(他们是无序的),但是他们需要平等和哈希。
对涉及排序的所有标准算法也是如此(sort
,nth_element
,lower_bound
,binary_search
等)。但是,find
算法(以及其他类似的算法,例如count
,search
,mismatch
等,确实需要等效函数,默认为operator==
。无标准库算法都需要。
由于您专门询问了find
成员功能,因此答案是set
和所有成员函数都可以通过订单比较来正常工作。
仍然,如果要定义operator<
。
- 二进制超载操作员=
- GLM超载操作员用于地图不起作用
- 使用超载操作员可以实现另一个操作员超载
- 超载操作员|用于固定尺寸的数组
- 超载<<操作员意外行为?
- 实施超载操作员的麻烦
- 如何超载操作员 如果调用对象不是类对象
- 如何使用向量将类对象存储在超载操作员中
- 在课堂上超载I/O操作员的奇怪行为
- 超载操作员 *
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 超载操作员 仅适用于类的特定情况
- AT()和超载操作员[] C 之间的差异
- 为什么我不能超载 *操作员
- 多个操作数,用于超载 *操作员
- MINGW中的全局超载操作员新/删除
- 超载操作员问题C++
- C 超载操作员问题
- 当我使用STL集时,我应该超载==操作员吗?
- C 我应该超载操作员