【发布时间】:2010-06-14 18:28:39
【问题描述】:
我有一个 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);
}
...这将解释它。下面的答案也包含更高层次的思考,我发现这很有用。
【问题讨论】:
-
不要插入
i,而是尝试插入(并在插入的同时打印到控制台)随机数,看看结果是否仍然是有序的,或者它们是否只是按它们的顺序排序被插入... -
如果你需要随机顺序,使用 std::random_shuffle :)
-
@Drakosha:我不是在寻找随机顺序,但有序的 unordered_map 让我感到不安。 (非最小测试用例有几千个整数,但它们仍然有序)
-
@FWFD: (哈哈)插入 rand() 给我一个无序的输出。
-
@Thanatos:和我想的一样! :)