使用重叠的关键帧合并两个未定义的贴图

Merging two unordered_maps with overlapping keys

本文关键字:两个 未定义 重叠 关键帧 合并      更新时间:2023-10-16

我想合并两个std::unordered_map:mapAmapB,同时如果两个映射都包含相同的键,则保留来自mapA的项的优先级。

有没有一种优雅的方法可以做到这一点(而不是验证每个键……我的映射包含大量元素)?

示例:

mapA = {{"sugar",0.1},{"salt",0.2}}
mapB = {{"sugar",0.3},{"pepper",0.4}}

我想要的结果是:

result = {{"sugar",0.1},{"salt",0.2},{"pepper",0.4}}

忽略mapB 中的键值{"sugar",0.3}

谢谢。

绝对:

auto result = mapA;
result.insert(mapB.begin(), mapB.end());

如果密钥已经存在于容器中,则unordered_mapinsert成员函数不执行任何操作。

演示。

我知道这个问题被标记为C++11,但为了完整性,如果您不关心保持mapB的完整性,那么似乎值得一提的是,C++17添加了merge()函数。merge()将键不在mapA中的所有元素从mapB移动到mapA。如果键在mapA中,则该元素的mapA保持不变,而该元素保持在mapB中。

https://en.cppreference.com/w/cpp/container/unordered_map/merge

由于std::unordered_map未排序,因此没有其他方法。您必须在mapB中的每个元素上循环,并尝试将其插入mapA中。mapA中的现有元素将不会插入。