我正在寻找一种将值从一个映射复制到另一个映射的方法,类似于这个问题,但我不希望冲突的值被第二个映射覆盖,我希望原始值保持不变。
例如,如果我有两张地图{a: 1, b: 2}
,我复制{b: 3, c: 4}
到其中,第一张地图将被修改为{a: 1, b: 2, c: 4}
.
有没有办法使用标准库函数来做到这一点,还是我需要通过迭代手动完成并检查冲突的值?
有一个版本map.insert
需要两个迭代器。如果项目(键)已存在于目标映射中,则插入失败,因此这正是您想要的。
#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
lambda 来执行此操作:
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
一个 lambda 中。据我所知,没有更好的方法来做你想要实现的目标。
如果您的编译器支持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
将保留元素,仅当前一个元素不存在时才构造一个新元素。