【问题标题】:How to merge two unordered_maps without changing the order of the elements?如何在不改变元素顺序的情况下合并两个 unordered_maps?
【发布时间】:2016-05-20 08:58:54
【问题描述】:

我需要在不改变顺序的情况下合并两个unordered_maps。 例如,

unordered_map<int,int> map1 ,map2, map3;

map1 包含:

map2 包含:

map1 和 map2 与 map3 合并。

所以我的 map3 应该包含

map<int,int>::iterator it   = map3.begin();
std::merge(map1.begin(),map1.end(),map2.begin(),map2.end(),inserter(map3,it));

仍然 map3 的顺序在变化。 我曾尝试使用 std::merge 和插入,但没有按照上述要求工作。有人可以帮我解决这个问题。还是我在合并和插入时犯了一些错误?

【问题讨论】:

    标签: c++ dictionary merge stl unordered-map


    【解决方案1】:

    std::merge 假设两个已经排序的范围(在你的情况下是两个未排序的地图)实现线性时间性能。由于它的实现,使用未排序的地图不会给出所需的结果。

    【讨论】:

      【解决方案2】:

      std::unordered_map 不保证任何顺序,而std::map 始终按键排序(尽管您可以指定自己的比较函数)。看起来您想要按插入顺序排列的项目。在这种情况下,您只需将数据推送到 std::vector,尽管您将不得不放弃映射类型提供的次线性操作。

      【讨论】:

      • 所以你的意思是说,无序映射会在插入时对键进行某种排序?
      • 没有。实际上std::unordered_maphash table。我不确定标准对它的明确程度,但它确实像哈希表一样行走,像哈希表一样嘎嘎作响。它会可能按照哈希的排序顺序(并且在同一个哈希桶中,按照插入的顺序)进行迭代,但这当然不能保证。因此,当您从 begin 迭代到 end 时,您可以依靠命中所有元素,但仅此而已。
      【解决方案3】:

      地图元素的顺序取决于其键和平衡树算法,但与源地图元素的顺序无关。如果您想保存订单,请改用std::vector&lt;std::pair&lt;inr,int&gt;&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 2020-09-13
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多