其中运营商需要以使用std ::在C ++代码中设置被覆盖?(Which operator need

2019-07-29 17:41发布

这是一个面试问题。

参考示例代码,需要其中的运营商之一,以便使用被覆盖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 <
 */

其实,我不明白为什么运营商这里需要重写。 “设置”不允许重复的元素,也许运营商!=需要重写?

Answer 1:

不必重写任何操作,该std::set类模板允许你提供一个比较函数作为模板参数。 但是,如果你要提供一个运营商,所需要的是一个bool operator<() 该运营商必须实施严格的弱序 。 看到这个的std ::设置文档。

用严格的弱序化的原因是因为集是一个有序的容器,通常被实现为一个自我平衡二叉树。 因此,它是不够的,知道两个元素是否相同与否。 该组必须能够对它们进行排序。 和比操作者或比较算符的少也用于测试元件平等。



Answer 2:

您需要执行operator<你的类型。 实现必须遵守严格偏弱序能够与来自标准库的关联容器,如使用std::setstd::map

阅读:

  • 严格弱顺序

这里有一个例子:

  • STD地图组合键


Answer 3:

一组保留了副本,而不需要operator=operator!=用等价的概念。 两个项目都是等价的,如果两者都不是小于其它:

if (!(a < b || b < a))
    // equivalent!


Answer 4:

要加快重复元素的执法和一般检查,如果元件在其通常是某种树的,只需要运营商<。 (较少的唯一用途是通过标准的强制执行,剩下的只是该avarage实现)



文章来源: Which operator needs to be overridden in order to use std::set in the C++ code?