[英]In the C++0x standard there will be unordered_map, how does this compare to boosts unordered_map?
哪个更有效率? 有没有好的基准测试?
C ++ 11的std :: unordered_map规范类似于boost :: unordered_map,它基于tr1 :: unordered_map。 话虽如此,但存在一些细微差别。 在C ++ 11中添加rvalue引用会导致增加emplace和emplace_hint函数,这些函数可能对性能有用。
C ++ 11现在已经广泛实现,因此您应该可以使用开箱即用的std :: unordered_map。 C ++ 14没有显着改变它,C ++ 17将(可能)添加insert_or_assign和try_emplace成员函数。
在c ++ 0x最新标准草案n3225中,有一节23.6.1类模板unordered_map。
所以它已经存在了。
基于boost one提出了C ++ 0x unordered_map。 Boost库本身也有一个命名空间tr1 :: unordered_map,它共享自己的boost :: unordered_map的实现。
如果你想比较(当然你不需要比较boost和boost),我认为其他几个编译器,包括microsoft visual studio 2010和gcc,都有自己的unordered_map实现。 您可以通过假设它们位于命名空间tr1下来使用它们。
#include <unordered_map>
...
std::tr1::unordered_map<...>
我还不知道任何基准测试,但我认为在这个早期,任何基准测试都没有意义,因为当真正的标准最终确定并且更多人将使用该库时,编译器实现者肯定会优化他们自己的实现。
还没有提到的一个小问题是, std::hash
函数只需要能够计算内置类型和字符串(以及其他一些类型)的哈希值。 boost::hash
函数可以计算更复杂对象的散列,例如pair
和tuple
。 boost还有一个hash_combine
函数,可以帮助为用户定义的类型创建哈希值。
这意味着std::unordered_set< pair<int, int> >
不会编译,但boost::unordered_set< pair<int, int> >
将会。
如果需要,您可以将boost::hash
与std::unordered_*
使用。
(参考: 图书馆扩展技术报告问题清单中的第6.18项。)
这取决于实施和相关数据集。 当我在博客文章中使用unordered_map
,我发现VS10的std::unordered_map
boost::unordered_map
对于我使用的输入 (比如我没有建立彻底的基准测试),比boost::unordered_map
更糟糕。 理论上认为应该没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.