哪个更有效?有什么好的基准测试吗?

有帮助吗?

解决方案

C ++ 11的std :: Unordered_map规范类似于基于tr1 :: unordered_map的boost :: 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。

所以它已经在那里。

C ++ 0x unordered_map是基于Boost One提出的。 Boost Library本身还具有命名空间TR1 :: UNOREREDED_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 功能可以计算更复杂的对象的哈希(例如 pairtuple. 。也有一个 hash_combine 功能以帮助创建用户定义类型的哈希。

这意味着 std::unordered_set< pair<int, int> > 不会编译,但是 boost::unordered_set< pair<int, int> > 将要。

您可以使用 boost::hashstd::unordered_* 如果需要的话。

(参考:项目6.18 in 图书馆扩展技术报告问题清单.)

这取决于实现和相关数据集。当我和 unordered_map 为一个 博客文章 我发现VS10 std::unordered_map 胜过比 boost::unordered_map 对于输入,我使用了 (我没有建立彻底的基准)。从理论上讲,应该没有区别。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top