实际上我需要一个数据结构来帮助我减少查找和检索相应键值的时间。
现在我正在使用带有键作为结构的地图容器,并希望尽快检索其值。
我在Fedora 12上使用gcc。我也尝试了无序映射,但它不能与我的编译器一起使用。
此外,名称空间std
中没有哈希映射。
答案 0 :(得分:3)
如果您使用的是C ++ 11,请使用std::unordered_map
中定义的<unordered_map>
。
否则,请使用std::tr1::unordered_map
中定义的<tr1/unordered_map>
或boost::unordered_map
中定义的<boost/unordered_map.hpp>
。
如果您的密钥是用户定义的类型,那么您需要为该类型定义hash
和operator==
,或者为unordered_map
提供合适的函数类型作为模板参数
当然,您还应该衡量与std::map
相比的表现;在某些情况下可能会更快。
答案 1 :(得分:0)
哈希映射称为unordered_map。您可以从boost获取它,即使您无法使用std / tr1工作,也可能会有效。通常,查找时间是“常量”,这意味着它不会随着元素的nubmer的复杂性而增加。但是你必须更详细地看一下这个:
“常数”假设您从未超过固定数量的“碰撞”。你不可能不会有任何东西,然后你必须衡量会有一些碰撞的事实。
“常量”包括散列键的时间。这是一个恒定的时间,因为它对集合中有多少其他元素没有区别,但是它仍然是一个需要完成的任务,到那时你的std :: map可能已经找到了你的元素。
如果密钥的散列速度非常快且分布均匀,那么很少发生冲突,那么散列的确会更快。
使用哈希映射时我总能发现的一件事是,为了获得最佳性能,您几乎总是通过编写自己的实现而不是使用标准实现来获胜。那是因为您可以根据您知道要处理的数据自定义自己的调整。也许这就是他们没有将哈希地图放入原始标准的原因。
我写自己的一件事就是用密钥存储实际的哈希值(最初生成的哈希值)。这是第一个比较点(通常比比较键更快,因为它只是一个int),并且还意味着如果你调整哈希表的大小,它不需要重新生成。
请注意,如果您从不从中删除任何内容,则哈希表更容易实现,即它只是加载和只读。