我是一个java家伙..学习c ++.我正在尝试使用c ++中的map std::map.不知何故,我还需要覆盖其哈希码和equals方法.我可以在c ++ 11中使用unordered_map但是如何在旧版本中执行此操作.我知道std::map,第三个参数是operator<但不是哈希码(如in unordered_map).我也知道std::map(有序地图)实际上是一个TreeMap(红黑树).但我怎么做,我想做,使用这个数据结构或旧的c ++版本中的其他一些.
如您所述,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.这可以通过两种不同的方式覆盖:
版本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及更高版本稍微更改了声明,但机制或多或少保持不变.