我正在尝试使用google dense_hash_map存储键值数据而不是std:map。
当我使用(int,int)对进行测试时,我设置了set_empty_key(mymap,-2)并且它有效。
但是,现在当我将它与我的(散列,值)对一起使用时,我设置了set_empty_key(mymap -2)或set_empty_key(mymap,some_random_hash),在我的程序在set_empty_key();中崩溃的情况下。
任何人都可以指导我吗?我该如何修复此崩溃?
感谢。
答案 0 :(得分:8)
我不知道你遇到崩溃的确切原因,但根据你的描述,我发现至少有两个潜在的错误。
首先。检查key_type
和data_type
类型是否为POD类型,并且不包含指向自身的指针。更具体地说(original):
key_type和data_type都必须是 普通的旧数据。另外,应该 没有数据结构 直接分成关键或价值的部分, 包括键或值本身(for 例如,你不能拥有像这样的价值 struct {int a = 1,* b =& a}。这是 因为dense_hash_map使用malloc() 和free()为空间分配空间 键和值,以及memmove() 重新组织关键和价值 存储器中。
二。关于使用dense_hash_map。您需要设置一些特殊的“空”键值,该值永远不会用于存储在您的集合中的真实元素。此外,如果您要使用erase()
,则需要为已删除的项目指定特殊键,这些键也永远不会用作实际存储项目的键。
这完美地描述了here:
dense_hash_map要求你打电话 紧接着set_empty_key() 构造哈希映射,之前 调用任何其他dense_hash_map 方法。 (这是最大的 dense_hash_map之间的区别 API和其他哈希映射API。看到 implementation.html为什么会这样 必要的。) set_empty_key()应该是键值 从来没有用于合法的 哈希映射条目。如果你没有这样的话 关键值,你将无法使用 dense_hash_map。打电话是个错误 insert()的项目,其键是 “空钥匙。” dense_hash_map也 要求你调用set_deleted_key() 在调用erase()之前。争论 to set_deleted_key()应该是一个 永远不会用的键值 合法的哈希映射条目。它必须 与使用的键值不同 for set_empty_key()。这是一个错误 没有先调用就调用erase() set_deleted_key(),它也是一个 使用项调用insert()时出错 其关键是“已删除的密钥”。