合并两个STL地图

我怎样才能将两个STL地图合并成一个? 他们都有相同的键值types(地图)。 如果有重叠的键,我想优先考虑其中一个地图。

假设您想要保留mapA中的元素,并将mapB中的元素合并到mapA中没有键:

mapA.insert(mapB.begin(), mapB.end()) 

会做你想做的,我想。

编辑:添加工作的例子

 #include <iostream> #include <map> void printIt(std::map<int,int> m) { for(std::map<int,int>::iterator it=m.begin();it!=m.end();++it) std::cout << it->first<<":"<<it->second<<" "; std::cout << "\n"; } int main() { std::map<int,int> foo,bar; foo[1] = 11; foo[2] = 12; foo[3] = 13; bar[2] = 20; bar[3] = 30; bar[4] = 40; printIt(foo); printIt(bar); foo.insert(bar.begin(),bar.end()); printIt(foo); return 0; } 

输出:

 :!./insert 1:11 2:12 3:13 2:20 3:30 4:40 1:11 2:12 3:13 4:40 

如果你想从一个地图复制到另一个地图,你可以使用std::mapinsert

 targetMap.insert(sourceMap.begin(), sourceMap.end()); 

但是请注意,如果insert的键已经在targetMap中, insert不会更新元素; 这些物品将保持原样。 要覆盖元素,你必须明确地复制,例如:

 for(auto& it : sourceMap) { targetMap[it.first] = it.second; } 

如果您不介意在sourceMap丢失数据,另一种实现复制和覆盖的方法是insert目标插入到源代码中,并将std::swap结果std::swap

 sourceMap.insert(targetMap.begin(), targetMap.end()); std::swap(sourceMap, targetMap); 

交换之后, sourceMap将包含targetMap的旧数据, targetMap将是两个map的合并,优先考虑sourceMap的条目。

根据ISO / IEC 14882:2003,第23.1.2节,表69,expression式a.insert(i,j):

pre:i,j不是迭代器。 当且仅当在具有唯一键的容器中不存在具有等同于该元素的键的键的元素时,插入来自范围[i,j)的每个元素;

既然std :: map必须遵循这个限制,如果你想优先考虑从一个地图到另一个地图的“值”,你应该插入它。 例如,

 std::map<int, int> goodKeys; std::map<int, int> betterKeys; betterKeys.insert(goodKeys.begin(), goodKeys.end()); 

因此,如果好键和更好键中有相同的键,则更好键的“值”将被保留。