Google的density_hash_map在set_empty_key函数中崩溃

问题描述

|| 我正在尝试使用Google density_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();中崩溃。 有人可以指导我吗?如何解决此崩溃? 谢谢。     

解决方法

我不知道您崩溃的确切原因,但是根据您的描述,我至少看到了两个潜在的错误。 第一。检查
key_type
data_type
类型都是POD类型,并且不包含指向其自身的指针。更具体地说(原始):   key_type和data_type都必须为   普通的旧数据。另外,应该   没有指向的数据结构   直接分为关键或价值部分,   包括键或值本身(对于   例如,您不能有类似的值   结构{int a = 1,* b =&a}。这是   因为density_hash_map使用malloc()   和free()为   键和值,以及memmove()   重新组织关键和价值   记忆。 第二。关于使用density_hash_map。您需要设置一些特殊的“空”键值,该键值永远不会用于存储在集合中的真实元素。此外,如果要使用
erase()
,则需要为删除的项目指定特殊键,而该键也永远不会用作实际存储项目的键。 这是完美的描述:   density_hash_map需要您致电   set_empty_key()之后   构造哈希图,以及之前   调用任何其他density_hash_map   方法。 (这是最大的   density_hash_map之间的区别   API和其他哈希映射API。看到   Implementation.html为什么会这样   必要。)   set_empty_key()应该是键值   从不用于合法   哈希映射条目。如果没有   键值,您将无法使用   density_hash_map。打电话是错误的   insert()带有键为   \“空密钥。\”   需要您调用set_deleted_key()   在调用Ease()之前。争论   set_deleted_key()应该是   从未用于的键值   合法的哈希映射条目。它必须   与使用的键值不同   对于set_empty_key()。这是一个错误   无需先调用即可调用擦除()   set_deleted_key(),它也是   调用带有项目的insert()时出错   其键为“已删除键”。