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

时间:2016-01-12 20:23:47

标签: c++ algorithm dictionary stl

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

我已经编写了一个简单的循环来执行此操作,但我想知道是否有更好的方法使用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

3 个答案:

答案 0 :(得分:2)

这不会短得多,但是当价值比int更复杂时,效率可能更高:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

感谢大家。