2 つの STL マップを 1 つにマージするにはどうすればよいですか? どちらも同じキーと値の型 ( map<string, string>
) を持っています。キーの重複がある場合は、いずれかのマップを優先したいと思います。
5 に答える
の要素を保持し、 にキーがないmapA
要素をマージするとします。mapB
mapA
mapA.insert(mapB.begin(), mapB.end())
あなたが望むことをするでしょう、私は思います。
(編集: C++17 以降を使用している場合は、この回答を検討してください: https://stackoverflow.com/a/56594603/118150 )
作業例:
#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::map
。insert
targetMap.insert(sourceMap.begin(), sourceMap.end());
ただしinsert
、キーが既に targetMap にある場合、要素は更新されないことに注意してください。それらのアイテムはそのまま残されます。要素を上書きするには、明示的にコピーする必要があります。例:
for(auto& it : sourceMap)
{
targetMap[it.first] = it.second;
}
のデータが失われても構わない場合はsourceMap
、コピーと上書きを行う別の方法としてinsert
、ターゲットをソースとstd::swap
結果に変換する方法があります。
sourceMap.insert(targetMap.begin(), targetMap.end());
std::swap(sourceMap, targetMap);
スワップ後、にはの古いデータsourceMap
が含まれ、のエントリを優先して 2 つのマップがマージされます。targetMap
targetMap
sourceMap
ISO/IEC 14882:2003、セクション 23.1.2、表 69 によると、式 a.insert(i,j):
pre: i,j は a への反復子ではありません。一意のキーを持つコンテナー内に、その要素のキーと同等のキーを持つ要素がない場合に限り、範囲 [i, j) から各要素を挿入します。
その std::map はこの制限に従わなければならないため、あるマップの「値」を別のマップよりも優先したい場合は、それに挿入する必要があります。例えば、
std::map<int, int> goodKeys;
std::map<int, int> betterKeys;
betterKeys.insert(goodKeys.begin(), goodKeys.end());
したがって、goodKeys と betterKeys に同等のキーがある場合、betterKeys の「値」は保持されます。