C ++ 11:unordered_map / set是否保证遍历顺序为插入顺序?

时间:2018-11-20 09:18:33

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

我写了一些这样的代码:

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一样保证访问顺序为插入顺序?

1 个答案:

答案 0 :(得分:6)

不,它是unordered,没有这样的保证。

  

无序关联容器中的元素被组织为   存储桶,具有相同哈希值的键将最终出现在同一存储桶中。的   当容器尺寸增加时,桶数增加   增加以将每个存储桶中的平均元素数量保持在   一定的值。

     

重新哈希会使迭代器无效,并可能导致元素变为   在不同的存储桶中重新排列,但不会使引用无效   元素。

这对unordered_mapunordered_set均有效。

您可能还想检查这个问题Keep the order of unordered_map as we insert a new key


但是,在内部,无序容器的实现可能使用list或其他有序容器来存储元素,并仅在其存储桶中存储对子列表的引用,将使迭代顺序与插入顺序一致,直到插入足够多的元素导致列表重新排列。 VS实现就是这种情况。