从另一个映射中更新映射的值

5
假设我有两个相同类型的地图,第二个地图的键集是第一个地图键集的子集。我想使用第二个地图的值来更新第一个地图中的值(只更新第二个地图包含的键)。我已经编写了一个简单的循环来完成这个操作,但我想知道是否有更好的使用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;
}

输出:

  Dad 45
  Granny 77
  John 24
  Liza 20

我已经为此编写了一个简单的循环,但是否有更好的方法使用STL算法来编写它?你的问题不太清楚。你应该知道map1[person.first] = person.second;无条件地插入值,无论之前是否指定了map1[person.first] - πάντα ῥεῖ
正如我所写的,map2中的键是map1中键的子集,换句话说,我有一个前提条件,即map1包含map2中的所有键,并且我想使用map2中这些键的值来更新map中的值。 - Pustovalov Dmitry
你是否检查过 map 接口以进行范围插入?你是否检查过现有的算法,看看是否可以使用其中的某些内容? - Ulrich Eckhardt
1
我想不出比你所写的更简单的东西了。 - R Sahu
@UlrichEckhardt Range insert 无法帮助我更新地图中的元素,这是我的情况。我已经检查了算法,在这种情况下没有找到有用的东西。 - Pustovalov Dmitry
写成map1["John"] = 23;而不是map1.insert(std::make_pair("John", 23));会不会更易读呢?这样可以减少阅读代码的工作量。我想改一下,但在未经您同意之前不会轻举妄动 :-) - Wolf
3个回答

3

虽然长度不太短,但在值比 int 更复杂时,这种方法可能更有效率:

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

在评论中,您说map2map1的子集,那么您的方法可能是最简单的,并且不会比我的方法低效。


如果map2不是map1的子集,那么你的代码就更好了。 - Pustovalov Dmitry

1
如果您只想合并它们并保留map2中的元素:
std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());

它似乎在某种程度上工作,map1将包含正确的值,但决策似乎比循环不够清晰和直观,而且它还修改了map2。尽管如此,仍然是一个可能的变体。 - Pustovalov Dmitry

0

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

感谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接