繁体   English   中英

boost :: unordered_map被…命令了吗?

[英]boost::unordered_map is… ordered?

我有一个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);
}

...这将解释它。 下面的答案也具有更高层次的思考,我认为这很有用。

虽然我不是C ++人士,但我无法与boost内部交流,但我可以提出一些更高级的问题,以减轻您的担忧:

1)“无序”地图的保证是什么? 假设您有一个订购的地图,并且想要创建一个不保证订购的地图。 初始实现可以简单地使用有序映射。 提供比您的广告更强大的保证几乎从来不是问题。

2)哈希函数是对X-> int进行哈希处理的东西。 如果已经有整数,则可以使用identity函数。 尽管它可能并非在所有情况下都是最有效的,但它可以解释您所看到的行为。

基本上,看到这样的行为不一定是问题。

可能是因为您的哈希是小整数。 哈希表通常按以下方式计算放置项的存储桶的数量: bucket_index = hash%p其中p是质数,这是哈希表存储桶的数量,其大小足以提供低频率的冲突。

对于整数,hash等于整数的值。 您有很多数据,因此哈希表会选择一个较大的p。 对于任何大于i的p, bucket_index = i%p = i

进行迭代时,哈希表按其索引的顺序从其存储桶中返回项目,这对您来说是键的顺序。 :)

如果要查看随机性,请尝试使用较大的数字。

您做对了。 unordered_map不声称具有随机顺序。 实际上,它对顺序没有任何要求。 您不应该在顺序方面期待任何东西,这会造成混乱!

这是因为默认情况下,地图按“键的插入顺序”排序。 尝试添加随机键值并查看结果。 每次都不一样,应该不一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM