C++旧版本(不是 C++11)-- map -> 覆盖哈希代码
C++ old version (not c++11 )-- map -> override hash code
我是个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及以上版本稍微更改了声明,但机制或多或少保持不变。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- EASTL矢量<向量<int>>连续的
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- 覆盖应用程序的低级别键盘挂钩问题
- glBindTexture 是否覆盖活动纹理单元的内容