我写了一些这样的代码:
unordered_map<int, int> uii;
uii.insert(make_pair(12,4));
uii.insert(make_pair(3,2));
uii.insert(make_pair(6,1));
uii.insert(make_pair(16,9));
....
当我使用for循环访问此地图时,它将按插入的正确顺序打印密钥。我测试了unordered_set,结果相同。
所以我的问题是,C ++标准是否像Java的LinkedHashMap
一样保证访问顺序为插入顺序?
答案 0 :(得分:6)
不,它是unordered
,没有这样的保证。
无序关联容器中的元素被组织为 存储桶,具有相同哈希值的键将最终出现在同一存储桶中。的 当容器尺寸增加时,桶数增加 增加以将每个存储桶中的平均元素数量保持在 一定的值。
重新哈希会使迭代器无效,并可能导致元素变为 在不同的存储桶中重新排列,但不会使引用无效 元素。
这对unordered_map
和unordered_set
均有效。
您可能还想检查这个问题Keep the order of unordered_map as we insert a new key
但是,在内部,无序容器的实现可能使用list
或其他有序容器来存储元素,并仅在其存储桶中存储对子列表的引用,将使迭代顺序与插入顺序一致,直到插入足够多的元素导致列表重新排列。 VS实现就是这种情况。