Google的dense_hash_map在set_empty_key()函数中崩溃

时间:2011-05-25 13:47:33

标签: c++ data-structures hashmap

我正在尝试使用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();中崩溃的情况下。

任何人都可以指导我吗?我该如何修复此崩溃?

感谢。

1 个答案:

答案 0 :(得分:8)

我不知道你遇到崩溃的确切原因,但根据你的描述,我发现至少有两个潜在的错误。

首先。检查key_typedata_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()时出错   其关键是“已删除的密钥”。