哪个更有效率?有什么好的基准吗?
4 回答
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 成员函数。
一个尚未提及的小问题,该std::hash
函数只需要能够计算内置类型和字符串(以及一些其他类型)的哈希值。该boost::hash
函数可以计算更复杂对象的哈希值,例如pair
和tuple
。boost 还具有hash_combine
帮助为用户定义类型创建哈希的功能。
这意味着std::unordered_set< pair<int, int> >
不会编译,但boost::unordered_set< pair<int, int> >
会。
如果需要,您可以使用boost::hash
with 。std::unordered_*
(参考:Library Extension Technical Report Issues List 中的第 6.18 项。)
在 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<...>
我还不知道任何基准测试,但我认为在这个早期,任何基准测试都没有意义,因为当真正的标准最终确定并且更多人将使用该库时,编译器实现者肯定会优化他们自己的实现。
这取决于相关的实现和数据集。当我在玩博客文章unordered_map
时,我发现 VS10 的性能比我使用的输入要差得多(我没有建立一个彻底的基准测试)。理论上认为应该没有区别。std::unordered_map
boost::unordered_map