为了在C++代码中使用std :: set,需要覆盖哪个运算符?

use*_*107 0 c++ overriding class set

这是一个面试问题.

参考示例代码,需要覆盖哪个运算符才能使用 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 <
 */
Run Code Online (Sandbox Code Playgroud)

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

jua*_*nza 5

你不具备覆盖任何运营商,在std::set类模板允许你提供一个比较函数作为模板参数.但是如果你要提供一个运营商,那么需要的是bool operator<().该运算符必须实现严格的弱排序.请参阅此std :: set文档.

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