unordered_map如何工作/优化设计?

时间:2013-09-07 13:56:17

标签: c++ performance c++11 hashmap unordered-map

我正在另一个论坛上阅读以下帖子,这个帖子似乎对C ++内部有很多关于将数千个密钥插入“字典”的知识非常了解:

  

e)使用红黑或平衡树和地图完成地图和设置查找   每个项目都是“单独”分配的,所以如果你要分配500,000   仪器[通过符号]带有指向仪器对象类的指针   关联,你有'N'个字节[加上开销]   指针的字符串和4字节[加上开销]。并包括;   所有的一分钟,五秒,一秒钟的价格时间序列   STD中所有这些仪器的仪器和完整的贸易历史   容器。这是一个很大的记忆和很多更多的浪费   小对象分配开销!

     

f)众所周知,STD Map&使用LowerBound将所有键设置为FIND [Less   比较比较]这很慢。

     g)有些天才可能会说“不,他们使用的是   未排序的地图“......他们没有,但即使他们这样做,他们仍然是   对离散分配的元素进行字符串比较。

     

我在C ++中做的是以下(示例);

     

a)创建一个“自定义”就地String Class-object,它有两个   个性; a)字节数组,和b)模数4的整数数组   并在本土边界上对齐]。 b)使用自定义地图&设置,哪个   是基于2x维度的哈希,其中节点以平面分配   连续记忆区域[可能&可以动态重新调整大小]。 C)   String [整数格式]哈希由Integer完成管道化   CPU和密钥比较也是类似的。

     

使用这些技术,只能在C ++,C或ASM中完成   是至少4-5倍的MAGNITUDE的性能相同   在.NET,C#或Java中完成的事情。

http://www.elitetrader.com/vb/showthread.php?s=1eb70fb998d8a51d22050ea53d24db21&threadid=204368&perpage=6&pagenumber=3

如果我大致知道将要插入多少个键,那么我可以使用哪些技术来设计我自己的unordered_map实现,这比我的特定用法更有效?

(欢迎任何关于设计哈希函数的101s)

1 个答案:

答案 0 :(得分:6)

使用unordered_map您只需为密钥设计哈希函数。 C ++标准库为内置键类型提供了一组哈希函数,例如:hash<int>hash<float>。 如果您在默认情况下取消unordered_map<int,int>,则使用hash<int>作为哈希函数。 但是如果您想使用自己的对象作为密钥,则必须提供自己的哈希函数


优点: 虽然unordered_map<T>中的插入时间较长,但在从容器中检索O(1)对时,散列通常会提供(key,value)复杂度。