在无序容器中插入的确定性

时间:2014-07-28 08:38:09

标签: c++ c++11 unordered-map unordered-set

如果我在两个无序容器中插入相同的(大小和值)元素,那么遍历带有两个迭代器的容器总会在相同的位置给出相同的元素吗?

如果是,可以使用(单个!)散列函数来打破这种决定论吗?

1 个答案:

答案 0 :(得分:3)

这取决于:如果您以相同的顺序将相同的元素插入到两个不同的无序容器中,那么两个容器的顺序应该相同,即使订单本身未指定

推理有点复杂:像hash(k)这样的所有操作和重新分配都是确定性的。虽然标准中没有实际引用,但在find()之后在O(1)insert()执行{{1}}的能力似乎排除了任何类型的随机或其他非确定性插入。< / p>

但是,如果您更改插入顺序,则所有投注都会关闭,因为内部重新分配会更改元素的顺序:

23.2.5无序关联容器[unord.req]

  

9无序关联容器的元素是有组织的   进入水桶。具有相同哈希码的密钥出现在同一个存储桶中。   添加元素时,桶的数量会自动增加   到一个无序的关联容器,这样的平均数   每桶的元素保持在一个边界之下。重复无效   迭代器,更改元素之间的排序,并更改哪些   存储桶元素,但不会使指针无效或   对元素的引用。对于unordered_multiset和unordered_multimap,   rehashing保留了等价元素的相对排序。