Merge two STL maps

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

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.



文章来源: Merge two STL maps
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!