为什么C++ STL容器使用"小于"运算符<而不是"等于"运算符==作为比较器?

iam*_*ind 4 c++ operator-overloading map comparator

在自定义类中实现比较器运算符时std::map,我遇到了这个问题,无法看到任何问题.

除了上述问题,还有兴趣简要了解一下,如何operator<工作std::map.

问题的起源:

struct Address {
  long m_IPv4Address;
  bool isTCP;
  bool operator< (const Address&) const;  // trouble
};
Run Code Online (Sandbox Code Playgroud)

qua*_*dev 6

因为std::map是一个有序的关联容器,它的键需要排序.

一个==运营商不会允许订购多个密钥

您可能正在寻找std::unordered_map,哪个工作有哈希表.您可以指定自己的哈希和相等运算符函数:

explicit unordered_map( size_type bucket_count,
                    const Hash& hash = Hash(),
                    const KeyEqual& equal = KeyEqual(),
                    const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)


Yak*_*ont 5

std::map<K,D>需要能够排序。默认情况下是use 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 );
  }
};
Run Code Online (Sandbox Code Playgroud)

使用std::tie定义为您<tuple>生成合适<的商品。 std::tie接收一堆数据,并生成一个已经定义tuple好的引用<


1对于指针,它使用一些与指定行为兼容的比较,而<<未指定行为的情况下表现良好<。这仅对分段内存模型和其他晦涩的架构真正重要。

  • std::tie 技巧很棒,这就是我一直在寻找的优雅解决方案。 (3认同)