c++ - 为什么 C++ STL 容器使用 "less than"operator< 而不是 "equal equal"operator== 作为比较器?

标签 c++ map operator-overloading comparator

std::map 的自定义类中实现比较运算符时,我遇到了这个问题,但看不到任何被问到的地方。

除了上述问题,也有兴趣简要了解,如何operator<适用于 std::map .

问题来源:

struct Address {
  long m_IPv4Address;
  bool isTCP;
  bool operator< (const Address&) const;  // trouble
};

最佳答案

std::map<K,D>需要能够排序。默认情况下使用 std::less<K> , 对于非指针使用 < 1

使用您对用户的要求最少的规则,它从 < 综合“等价”当它需要它时(!(a<b) && !(b<a) 表示 ab 是等价的,即两者都不小于另一个)。

这使得编写用作 map 的关键组件的类变得更加容易,这似乎是个好主意。

std使用 == 的容器例如 std::unordered_map ,它使用 std::hash== .同样,它们的设计使它们对用户的要求最少——您不需要对 unordered_ 进行完整的订购。容器,只是等价和好的hash .

碰巧,写一个<真的很容易如果您有权访问 <tuple> .

struct Address {
  long m_IPv4Address;
  bool isTCP;
  bool operator< (const Address& o) const {
    return
      std::tie( m_IPv4Address, isTCP )
      < std::tie( o.m_IPv4Address, o.isTCP );
  }
};

它使用 std::tie<tuple> 中定义生成一个合适的 <为你。 std::tie获取一堆数据,并生成一个 tuple的引用资料,其中有一个很好的<已经定义。


1 对于指针,它使用一些与 < 兼容的比较其中 <指定了行为,并且在 < 时表现良好才不是。这只对分段内存模型和其他晦涩的架构很重要。

关于c++ - 为什么 C++ STL 容器使用 "less than"operator< 而不是 "equal equal"operator== 作为比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153303/

相关文章:

r - R中的地理热图

c++ - 从友元函数返回局部变量的引用

c# - 为什么 '='不能在C#中重载?

c++ - 在平面上绘制圆, bool 减法 - OpenGL

C++在虚方法中访问公共(public)变量

c++ - 由于无法访问主函数之外的 SDL 函数而导致崩溃

c++ - 在数值表达式中最方便地使用数值包装类的选项有哪些?

c++段错误(核心转储)与模数

java - Map<?, ?> 在 Java 中是什么意思?

c++ - 嵌套 map 是正常做法还是非常糟糕?