如果我将已排序的数据插入unordered_map
,当我迭代时,我会将数据排序吗?现在我遇到了问题。我插入已排序的数据,但迭代时我的数据未分类。
答案 0 :(得分:2)
来自文档:http://www.cplusplus.com/reference/unordered_map/unordered_map/
在内部,unordered_map中的元素不会按照其键值或映射值按任何特定顺序排序,而是根据其哈希值组织到存储桶中,以允许直接通过键值快速访问各个元素(平均时间复杂度恒定。)
由于元素的组织依赖于哈希值,因此迭代的顺序不一定受添加元素的顺序的影响。换句话说,从地图读取的元素未被排序的事实是预期的行为。
Java提供了一个非常方便的容器,称为LinkedHashMap,它在迭代集合时强制执行插入顺序。不幸的是,C ++标准库没有为此提供内置容器。到目前为止我见过的最有希望的是boost :: multi_index_container,但设置和使用似乎并不容易。请随意浏览文档:http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html
答案 1 :(得分:2)
如果要插入的元素数量低于表格大小,也就是说,没有碰撞,根据您的散列函数,由其函数计算的位置我与值本身相关,因此对于此集合你有一个有序地图的元素。
例如,将哈希函数视为x mod 10
。您插入3个元素:1,4,5
。
他们的哈希将是:1,4,5
,这将是他们在桌面上的位置。
但是,如果插入另一个与先前插入的数据冲突的元素,则顺序将更改。在示例中,如果插入11:11 mod 10 = 1
,假设碰撞已解决,在表中查找第一个空闲位置,结果顺序为:1,11,4,5