How can I merge two STL maps into one? They both have the same key value types (map). If there is overlap of the keys I would like to give preference to one of the maps.
问题:
回答1:
Assuming you want to preserve the elements in mapA, and merge elements in mapB for which there is no key in mapA:
mapA.insert(mapB.begin(), mapB.end())
will do what you want, I think.
EDIT: adding working example
#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; }
output:
:!./insert 1:11 2:12 3:13 2:20 3:30 4:40 1:11 2:12 3:13 4:40
回答2:
If you want to copy entries from one map to another, you can use std::map
's insert
:
targetMap.insert(sourceMap.begin(), sourceMap.end());
But note that insert
does not update elements if their key is already in targetMap; those items will be left as-is. To overwrite elements, you will have to copy explicitly, e.g.:
for(auto& it : sourceMap) { targetMap[it.first] = it.second; }
If you don't mind losing the data in sourceMap
, another way to achieve a copy-and-overwrite is to insert
the target into the source and std::swap
the results:
sourceMap.insert(targetMap.begin(), targetMap.end()); std::swap(sourceMap, targetMap);
After swapping, sourceMap
will contain targetMap
's old data, and targetMap
will be a merge of the two maps, with preference for sourceMap
's entries.
回答3:
According to ISO/IEC 14882:2003, section 23.1.2, Table 69, expression a.insert(i,j):
pre: i,j are not iterators into a. inserts each element from the range [i, j) if and only if there is no element with key equivalent to the key of that element in containers with unique keys;
Since that std::map must follow this restriction, if you'd like to give preference to "values" from one map over another you should insert into it. For example,
std::map<int, int> goodKeys; std::map<int, int> betterKeys; betterKeys.insert(goodKeys.begin(), goodKeys.end());
So if there are any equivalent keys in goodKeys and betterKeys, "values" of the betterKeys will be preserved.
回答4:
Notice that, since C++17, there is a merge()
method for maps.