81

2 つの STL マップを 1 つにマージするにはどうすればよいですか? どちらも同じキーと値の型 ( map<string, string>) を持っています。キーの重複がある場合は、いずれかのマップを優先したいと思います。

4

5 に答える 5

143

の要素を保持し、 にキーがないmapA要素をマージするとします。mapBmapA

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
于 2010-09-03T21:50:53.837 に答える
37

あるマップから別のマップにエントリをコピーする場合は、 を使用できますstd::mapinsert

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 つのマップがマージされます。targetMaptargetMapsourceMap

于 2014-03-06T09:57:44.950 に答える
3

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 の「値」は保持されます。

于 2015-03-30T17:15:01.947 に答える