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:
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,
As mentioned in John Perry's answer, since C++17std::map provides a merge() member function. The merge() function produces the same result for the target map as jkerian's solution based on using merge()0, as you can see from the following example, which I borrowed from jkerian. I just updated the code with some merge()1 and C++17 features (such as merge()2, merge()3 with merge()4, and merge()5):
using mymap = std::map<int, int>;
void printIt(const mymap& m) {
for (auto const &[k, v] : m)
std::cout << k << ":" << v << " ";
std::cout << std::endl;
}
int main() {
mymap foo{ {1, 11}, {2, 12}, {3, 13} };
mymap bar{ {2, 20}, {3, 30}, {4, 40} };
printIt(foo);
printIt(bar);
foo.merge(bar);
printIt(foo);
return 0;
}
Output:
1:11 2:12 3:13
2:20 3:30 4:40
1:11 2:12 3:13 4:40
As you can see, merge() also gives priority to the target map foo when keys overlap. If you want to have it the other way round, then you have to call bar.merge(foo);.
However, there is a difference between using insert() and merge() regarding what happens to the source map. The insert() functions adds new entries to the target map, while merge() moves entries over from the source map. This means for the example above, that insert() does not alter bar, but merge() removes 4:40 from bar, so that only 2:20 and merge()0 remain in bar.
Note: I reused the example from jkerian which uses map<int, int> for the sake of brevity, but merge() also works for your map<string, string>.