5

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

4

4 回答 4

5

C++11 的 std::unordered_map 规范类似于基于 tr1::unordered_map 的 boost::unordered_map。话虽如此,还是有一些小的差异。在 C++11 中添加右值引用会导致添加可能对性能有用的 emplace 和 emplace_hint 函数。

C++11 现在已被广泛实施,因此您应该能够开箱即用地使用 std::unordered_map。C++14 并没有显着改变它,C++17 将(可能)添加 insert_or_assign 和 try_emplace 成员函数。

于 2010-12-11T16:05:11.637 回答
2

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

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

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

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

于 2010-12-13T16:25:30.607 回答
2

在 c++0x 最新标准草案 n3225 中,有一个 23.6.1 节的类模板 unordered_map。

所以它已经存在了。

C++0x unordered_map 是基于 boost one 提出的。Boost 库本身也有一个命名空间 tr1::unordered_map,它共享自己的 boost::unordered_map 的实现。

如果你想比较(当然你不需要比较 boost 和 boost),我认为其他几个编译器,包括 microsoft visual studio 2010 和 gcc,确实有自己的 unordered_map 实现。您可以通过假设它们位于命名空间 tr1 下来使用它们。

#include <unordered_map>
...
std::tr1::unordered_map<...>

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

于 2010-12-11T01:40:56.447 回答
1

这取决于相关的实现和数据集。当我在玩博客文章unordered_map时,我发现 VS10 的性能比我使用的输入要差得多(我没有建立一个彻底的基准测试)。理论上认为应该没有区别。std::unordered_mapboost::unordered_map

于 2010-12-12T09:44:35.220 回答