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

Lea*_*ner 0 c++ hashcode

我是一个java家伙..学习c ++.我正在尝试使用c ++中的map std::map.不知何故,我还需要覆盖其哈希码和equals方法.我可以在c ++ 11中使用unordered_map但是如何在旧版本中执行此操作.我知道std::map,第三个参数是operator<但不是哈希码(如in unordered_map).我也知道std::map(有序地图)实际上是一个TreeMap(红黑树).但我怎么做,我想做,使用这个数据结构或旧的c ++版本中的其他一些.

dhk*_*hke 5

如您所述,std :: map类似于Java的TreeMap.在Java中覆盖TreeMap的哈希代码是没有用的,因为它不会被集合使用.相反,TreeMap采用(可选的)附加参数:比较器.

std :: map几乎完全相同,但它没有运行时参数,它有一个编译时模板参数:

template <class Key, class T, class Compare = less<Key> [...]>
class map;
Run Code Online (Sandbox Code Playgroud)

如您所见,这默认为std :: less.这可以通过两种不同的方式覆盖:

  • 通过选择性特化为您的密钥类型定义新的std :: less.这将在其范围内全球使用,或
  • 在声明地图时提供自定义Comparer结构

版本1:

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

版本2:

 struct CompareKeys {
   bool operator()(const &Key lhs, const Key &rhs) const
   {
      // compare lhs with rhs
   }
 };

 std::map<Key, Value, CompareKeys> my_map;
Run Code Online (Sandbox Code Playgroud)

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

  • 但不要因为这污染了其他一切. (2认同)