C++ 使用其他地图中的值更新地图

C++ 使用其他地图中的值更新地图,c++,algorithm,dictionary,stl,C++,Algorithm,Dictionary,Stl,假设我有两个相同类型的映射,第二个映射的键集是第一个映射的键的子集。我想用第二个映射中的值更新第一个映射值(仅针对第二个映射包含的键) 我已经编写了一个简单的循环来实现这一点,但我想知道是否有更好的方法来使用STL算法来编写它 代码示例: using PersonAgeMap = std::map<std::string, int>; PersonAgeMap map1; map1.insert(std::make_pair("John", 23)); map1.insert(st

假设我有两个相同类型的映射,第二个映射的键集是第一个映射的键的子集。我想用第二个映射中的值更新第一个映射值(仅针对第二个映射包含的键)

我已经编写了一个简单的循环来实现这一点,但我想知道是否有更好的方法来使用STL算法来编写它

代码示例:

using PersonAgeMap = std::map<std::string, int>;

PersonAgeMap map1;
map1.insert(std::make_pair("John", 23));
map1.insert(std::make_pair("Liza", 19));
map1.insert(std::make_pair("Dad", 45));
map1.insert(std::make_pair("Granny", 77));

PersonAgeMap map2;
map2.insert(std::make_pair("John", 24));
map2.insert(std::make_pair("Liza", 20));

//simple cycle way
for (const auto& person: map2)
{
    map1[person.first] = person.second;
}

//is there some another way of doing this using STL algorithms???

for (const auto& person: map1)
{
    std::cout << person.first << " " << person.second << std::endl;
}

如果只想合并它们并保留map2中的元素:

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

这不会短很多,但当值比
int
更复杂时,可能会更有效:

for( const auto &p : map2 ) {
    auto r = map1.emplace( p );
    if( !r.second ) r.first->second = p.second;
}

PS在评论中你说
map2
map1
的一个子集,那么你的方法可能是最简单的,效率也不会比我的低。

似乎没有比简单循环更清晰更好的方法了


谢谢大家。

“我已经为它写了一个简单的循环,但是有没有更好的方法来使用STL算法来编写它?”有点不清楚您想要什么。您应该知道
map1[person.first]=person.second
无条件地插入值,无论之前是否指定了
map1[person.first]
。正如我所写的,map2中的键是map1中键的子集,换句话说,我有一个先决条件,即map1包含map2中的所有键,我想用map2中的值更新这些键的map中的值。您是否检查了
map
界面以进行范围插入?你检查过现有的算法了吗?我想不出比你的算法更简单的了。@UlrichEckhardt Range insert不能帮助我更新地图中的元素,这就是我的情况。我检查了算法,没有发现在这种情况下有用的东西。它似乎在某种意义上工作,map1将包含适当的值,但决策似乎不如cycle清晰直观,它还修改了map2。但仍然是一个可能的变体。如果map2不是map1的子集,那么您的代码会更好。
for( const auto &p : map2 ) {
    auto r = map1.emplace( p );
    if( !r.second ) r.first->second = p.second;
}