为什么C ++ STL容器使用"小于"运营商LT;而不是等于#34; operator ==作为比较器?

时间:2014-11-26 15:45:30

标签: c++ map operator-overloading comparator

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

除上述问题外,还有兴趣简要了解operator<std::map的作用。

问题的根源:

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

3 个答案:

答案 0 :(得分:5)

因为std::map是一个已排序关联容器,所以它的键需要排序。

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

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

explicit unordered_map( size_type bucket_count,
                    const Hash& hash = Hash(),
                    const KeyEqual& equal = KeyEqual(),
                    const Allocator& alloc = Allocator() );

答案 1 :(得分:5)

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

使用您向用户提出的最少要求的规则,它会综合&#34;等价&#34;来自<时需要它!(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 对于指针,它使用一些与指定<行为的<兼容的比较,并且在<没有指定时表现良好。这仅对分段存储模型和其他模糊架构非常重要。

答案 2 :(得分:2)

使用<您可以订购元素。如果a < b,那么a应放在集合中的b之前。

您还可以确定两个项目是否相同:如果!(a < b) && !(b < a)(如果两个对象都不小于另一个),则它们是等效的。

这两项功能都需要std::map。所以它只是期望它的元素类型提供一个运算符<

使用==您可以确定相等,但您无法订购元素。所以它不能满足std::map的要求。