gpt4 book ai didi

C++ 旧版本(不是 c++11 )-- map -> override hash code

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:54 24 4
gpt4 key购买 nike

我是一个 java 人..学习 c++。我正在尝试使用 std::map 在 C++ 中使用 map .不知何故,我还需要重写它的哈希码和 equals 方法。我可以在 c++11 中使用 unordered_map 做到这一点但我怎么能在旧版本中做到这一点。我知道在 std::map ,第三个参数为operator<但不是哈希码(如 unordered_map )。我也知道 std::map (一个有序的 map )实际上是一个TreeMap(红黑树)。但是我该怎么做,我想怎么做,使用这个数据结构或其他一些旧的 c++ 版本。

最佳答案

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

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

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

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

  • 要么通过选择性特化为您的 key 类型定义一个新的 std::less。这将在其范围内全局使用,或者
  • 在声明映射时提供自定义比较器结构

版本 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 及更高版本略微更改了声明,但机制或多或少保持不变。

关于C++ 旧版本(不是 c++11 )-- map -> override hash code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28808369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com