在C ++ 0x标准中会有unordered_map,这与boost unordered_map相比如何?

时间:2010-12-11 01:25:04

标签: c++ boost c++11 unordered-map

哪个效率更高?有没有好的基准测试?

4 个答案:

答案 0 :(得分:5)

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成员函数。

答案 1 :(得分:2)

在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<...>

我还不知道任何基准,但我认为在这个早期,任何基准测试都没有意义,因为编译器实现者肯定会在真正的标准最终确定并且更多人将使用库。

答案 2 :(得分:2)

尚未提到的一个小问题,std::hash函数只需要能够计算内置类型和字符串(以及其他一些类型)的哈希值。 boost::hash函数可以计算更复杂对象的哈希值,例如pairtuple。此外,boost还具有hash_combine函数,可帮助为用户定义的类型创建哈希值。

这意味着std::unordered_set< pair<int, int> >将无法编译,但boost::unordered_set< pair<int, int> >将会编译。

如果需要,您可以boost::hash使用std::unordered_*

(参考:the Library Extension Technical Report Issues List中的第6.18项。)

答案 3 :(得分:1)

这取决于实施和相关数据集。当我使用unordered_mapblog post时,我发现VS10的std::unordered_map对于我使用的输入而言比boost::unordered_map 更糟糕(我没有建立彻底的基准)。在理论上认为应该没有区别。