1

次の 2 つのマップを連結するにはどうすればよいですか?

map<string, map<string,string>> map1;
map<string, map<string,string>> map2;

map2に追加してmap1、すでにすべての要素を保持したいだけです。map1つまり、map2の最後に追加しmap1ます。を試してみましたがmap1.insert(map2.begin(), map2.end())、 の古い要素を上書きするため機能しませんmap1

4

6 に答える 6

6

それらをマージしたいだけで、衝突が発生した場合は要素を map1 から保持し、マップを逆にするだけです。

std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());

これはもちろん、マージ後は結果のみに関心があり、古いコレクションには関心がないことを前提としています。

于 2010-06-09T11:30:18.723 に答える
4

map<> には、1 つのキーに対して 1 つの値のみを含めることができます。たとえば、multimap<>を使用してみてください。

于 2010-06-09T11:20:33.457 に答える
1

単純な for ループでそれを行います: (もっともらしい場合は stl アルゴリズムを使用するのが好きです):

for(std::map<...>::const_iterator it = map2.begin(), it_end = map2.end(); it != it_end; ++it)
   map1.insert(*it);

キーがすでに map1にある要素は上書きされないため、上書きされmap::insertません。

于 2010-06-09T11:22:56.443 に答える
1

マップが大きすぎない場合は、反対の操作を行います。

map2.insert(map1.begin(), map1.end());
map1 = map2;

これにより、 の重複する値が上書きされますがmap2、 の値は保持されますmap1(これがあなたが望んでいたことだと理解しています)。

于 2010-06-09T11:26:35.390 に答える
1

質問は地図の概念と矛盾しています。マップに値を挿入すると、そのキーに応じて「適切な場所」にあることが期待されます。これは、キーごとにエントリが 1 つしかないことを意味します。

代わりに、avector< pair< mymap::key, myamap::value > >を使用して、最初の resp のエントリを入力できます。2番目のマップ。

map< string, int > map1, map2;
... fill the maps
vector< pair<string, int> > concatted;
concatted.insert( map1.begin(), map1.end() );
concatted.insert( map2.begin(), map2.end() );
于 2010-06-09T11:20:51.927 に答える