我有一个 boost::unordered_map,但它看起来是有序的,给我一种压倒性的“你做错了”的感觉。为什么输出是这样的?我希望底层的哈希算法能够随机化这个顺序:
#include <iostream>
#include <boost/unordered_map.hpp>
int main()
{
boost::unordered_map<int, int> im;
for(int i = 0; i < 50; ++i)
{
im.insert(std::make_pair(i, i));
}
boost::unordered_map<int, int>::const_iterator i;
for(i = im.begin(); i != im.end(); ++i)
{
std::cout << i->first << ", " << i->second << std::endl;
}
return 0;
}
...给我...
0, 0
1, 1
2, 2
...
47, 47
48, 48
49, 49
经过检查boost的源代码:
inline std::size_t hash_value(int v)
{
return static_cast<std::size_t>(v);
}
...这可以解释它。下面的答案也包含了更高层次的思考,我发现这很有用。
虽然我不能谈论 boost 的内部结构,因为我不是 C++ 人员,但我可以提出一些更高级别的问题来减轻您的担忧:
1)“无序”映射有什么保证?假设您有一个有序地图,并且您想要创建一个不保证排序的地图。初始实现可以简单地使用有序映射。提供几乎从来都不是问题stronger比你做广告的保证。
2) 哈希函数是对 X -> int 进行哈希处理的函数。如果您已经有一个整数,则可以使用恒等函数。虽然它可能不是在所有情况下都是最有效的,但它可以解释您所看到的行为。
基本上,看到这样的行为并不一定有问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)