0

这是一道面试题。

参考示例代码,其中一个运算符需要被覆盖才能使用 std::set<Value>

 #include<iostream>

 class Value
 {
      std::string   s_val;
      int           i_val;
  public:
      Value(std::string s, int i): s_val(s) , i_val(i){}
 };

 // EOF

 /*
 a       operator !=
 b       operator >
 c       operator <=
 d       operator >=
 e       operator <
 */

实际上,我不明白为什么需要在这里覆盖运算符。"set" 不允许重复元素,也许 operator != 需要被覆盖?

4

4 回答 4

5

您不必重写任何运算符,std::set模板允许您提供比较函数作为模板参数。但是,如果您要提供运算符,则需要的是bool operator<(). 该运算符必须执行严格的弱排序。请参阅此std::set文档。

使用严格弱排序的原因是因为 set 是一个有序容器,通常实现为自平衡二叉树。所以仅仅知道两个元素是否相同是不够的。该套装必须能够订购它们。并且小于运算符或比较器函子也用于测试元素是否相等。

于 2012-06-03T17:11:24.470 回答
2

您需要operator<为您的类型实现。实现必须遵循严格的弱排序才能与标准库中的关联容器(例如std::setstd::map.

阅读:

这里有一个例子:

于 2012-06-03T17:12:18.190 回答
1

一个集合在不需要operator=operator!=使用等价概念的情况下将重复项排除在外。如果两个项目都不小于另一个,则两个项目是等价的:

if (!(a < b || b < a))
    // equivalent!
于 2012-06-03T17:15:08.337 回答
0

为了加快执行不重复元素的速度,并通常检查元素是否在其通常某种树中并且只需要运算符 <。(less 的唯一用法是由标准强制执行的,其余的只是平均实现)

于 2012-06-03T17:12:05.437 回答