需要覆盖哪个运算符才能在C++代码中使用 std::set

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

本文关键字:代码 std set C++ 覆盖 运算符      更新时间:2023-10-16

这是一个面试问题。

参考示例代码,需要覆盖其中一个运算符才能使用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"不允许重复的元素,也许运算符!=需要被覆盖?

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

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

您需要

为您的类型实现operator<。实现必须遵循弱排序才能与标准库中的关联容器(如 std::setstd::map)一起使用。

阅读:

  • 严格的弱排序

这里有一个例子:

  • 标准映射组合键
集合通过使用

等价概念来保留重复项,而无需operator=operator!=。如果两个项目都不小于另一个项目,则两个项目是等效的:

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

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