この質問と同様に、あるマップから別のマップに値をコピーする方法を探していますが、競合する値を2番目のマップで上書きしたくないので、元の値をそのままにしておきます。
たとえば、2 つのマップ{a: 1, b: 2}
があり、そこにコピー{b: 3, c: 4}
した場合、最初のマップは に変更され{a: 1, b: 2, c: 4}
ます。
標準ライブラリ関数を使用してこれを行う方法はありますか、または反復と競合する値のチェックを通じて手動で行う必要がありますか?
map.insert
2 つのイテレータを取るバージョンがあります。アイテム (キー) がターゲット マップに既に存在する場合、挿入は失敗します。
#include <iostream>
#include <map>
int main() {
std::map<char, int> stuff;
stuff['a'] = 1;
stuff['b'] = 2;
std::map<char, int> stuff2;
stuff2['b'] = 3;
stuff2['c'] = 4;
stuff.insert(stuff2.begin(), stuff2.end());
for (auto i : stuff)
std::cout << i.first << "\t" << i.second << "\n";
}
結果:
a 1
b 2
c 4
std::for_each
とラムダを使用してこれを行うことができます:
std::map<int, int> m1 = ...;
std::map<int, int> m2 = ...;
std::for_each(m2.begin(), m2.end(),
[&m1](const std::pair<const int, int>& a)
{
if(m1.find(a.first) == m1.end())
m1.insert(a);
});
事実上、これは、手動で行わなければならないことをstd::for_each
ラムダにまとめているだけです。私の知る限り、あなたが達成したいことを行うためのより良い方法は実際にはありません.
コンパイラがサポートしている場合emplace
(GCC 4.7 はサポートしていませんが、4.8 はサポートしています)、それを利用できます。
std::for_each(m2.begin(), m2.end(),
[&m1](const std::pair<const int, int>& a)
{
m1.emplace(a.first, a.second);
});
emplace
要素を保持し、前の要素が存在しない場合にのみ新しい要素を構築します。