作者:朵儿lp_685 | 来源:互联网 | 2023-05-19 18:58
我是一个java家伙..学习c ++.我正在尝试使用c ++中的map std::map
.不知何故,我还需要覆盖其哈希码和equals方法.我可以在c ++ 11中使用unordered_map
但是如何在旧版本中执行此操作.我知道std::map
,第三个参数是operator<
但不是哈希码(如in unordered_map
).我也知道std::map
(有序地图)实际上是一个TreeMap(红黑树).但我怎么做,我想做,使用这个数据结构或旧的c ++版本中的其他一些.
1> dhke..:
如您所述,std :: map类似于Java的TreeMap.在Java中覆盖TreeMap的哈希代码是没有用的,因为它不会被集合使用.相反,TreeMap采用(可选的)附加参数:比较器.
std :: map几乎完全相同,但它没有运行时参数,它有一个编译时模板参数:
template [...]>
class map;
如您所见,这默认为std :: less.这可以通过两种不同的方式覆盖:
通过选择性特化为您的密钥类型定义新的std :: less.这将在其范围内全球使用,或
在声明地图时提供自定义Comparer结构
版本1:
template<>
struct std::less {
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 my_map;
C++ 14及更高版本稍微更改了声明,但机制或多或少保持不变.
但不要因为这污染了其他一切.