C++旧版本(不是 C++11)-- map -> 覆盖哈希代码

C++ old version (not c++11 )-- map -> override hash code

本文关键字:gt 覆盖 代码 哈希 map 版本 不是 C++11 C++      更新时间:2023-10-16

我是个java人。。学习c++。我正在尝试使用std::map在c++中使用map。不知怎么的,我还需要覆盖它的哈希代码和equals方法。我可以在c++11中使用unordered_map做到这一点,但在旧版本中我怎么能做到呢。我知道在std::map中,第三个参数是operator<,但不是hashcode(就像在unordered_map中一样)。我还知道std::map(有序映射)实际上是一个树映射(红黑树)。但是,我该如何使用这个数据结构或旧版c++中的其他数据结构来完成我想要完成的任务呢。

正如您所指出的,std::map类似于Java的TreeMap。在Java中重写TreeMap的哈希代码是没有用的,因为集合不会使用它。相反,TreeMap采用了一个(可选)附加参数:比较器。

std::map做了几乎相同的事情,但它没有运行时参数,而是有一个编译时模板参数:

template <class Key, class T, class Compare = less<Key> [...]>
class map;

正如您所看到的,这默认为std::less。这可以通过两种不同的方式来推翻:

  • 通过选择性专门化为您的密钥类型定义一个新的std::less。这将在其范围内全局使用,或者
  • 在声明映射时提供自定义Comparer结构

版本1:

 template<>
 struct std::less<Key> {
   bool operator()(const &Key lhs, const Key &rhs) const
   {
      // compare lhs with rhs
   }
 };

版本2:

 struct CompareKeys {
   bool operator()(const &Key lhs, const Key &rhs) const
   {
      // compare lhs with rhs
   }
 };
 std::map<Key, Value, CompareKeys> my_map;

C++14及以上版本稍微更改了声明,但机制或多或少保持不变。