代码之家  ›  专栏  ›  技术社区  ›  Troskyvs

C++ 11:无序序映射/集合是否保证遍历顺序为插入顺序?

  •  3
  • Troskyvs  · 技术社区  · 6 年前

    我写了一些这样的代码:

    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循环访问此地图时,它按插入的正确顺序打印键。我用同样的结果测试了无序的_集。

    所以我的问题是,C++标准是否保证访问顺序为插入顺序,就像Java一样。 LinkedHashMap ?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Yola    6 年前

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

    无序关联容器中的元素组织为 桶, 具有相同哈希值的键将以相同的存储桶结束 . 这个 当容器的大小增加时,桶的数量也会增加。 增加以保持每个桶中元素的平均数量 一定的价值。

    重新刷新使迭代器失效 可能导致元素 重新安排 在不同的存储桶中,但不会使引用无效 到元素。

    这两个都有效 unordered_map unordered_set .

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


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