PTS*_*PTS 8 c++ hashmap data-structures
我正在尝试使用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();中崩溃的情况下.
任何人都可以指导我吗?我该如何修复这次崩溃?
谢谢.
我不知道你遇到崩溃的确切原因,但根据你的描述,我发现至少有两个潜在的错误.
第一.检查两者key_type和data_type类型是否为POD类型,并且不包含指向自身的指针.更具体地说(原创):
key_type和data_type都必须是普通旧数据.此外,应该没有直接指向键或值部分的数据结构,包括键或值本身(例如,您不能拥有类似struct {int a = 1,*b =&a}的值.这是因为dense_hash_map使用malloc()和free()为键和值分配空间,而memmove()用于重新组织内存中的键和值.
第二.关于使用dense_hash_map.您需要设置一些特殊的"空"键值,该值永远不会用于存储在您的集合中的真实元素.此外,如果您要使用erase(),则需要为已删除的项目指定特殊键,这些键也永远不会用作实际存储项目的键.这里有完美的描述:
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还要求在调用erase()之前调用set_deleted_key().set_deleted_key()的参数应该是一个永远不会用于合法哈希映射条目的键值.它必须与set_empty_key()使用的键值不同.在没有首先调用set_deleted_key()的情况下调用erase()是错误的,并且使用其键为"已删除键"的项调用insert()也是错误的.