将一个地图的内容追加并替换为另一个地图?

时间:2017-06-23 21:23:42

标签: c++ stl unordered-map unordered

所以我知道map1.insert(map2.begin(), map2.end());会将map2的所有元素插入map1

map2中可能存在map1的某些元素。这些元素不会更新。

e.g. map1 has { 3 : 4, 6 : 7 }
     map2 has { 11: 5, 6 : 0 }

     Now if I do map1.insert(map2.begin(), map2.end()), I will get
     map1 = { 3: 4, 6 : 7, 11 : 5 }

     But what I want is
     map1 = { 3: 4, 6 : 0, 11 : 5 }

我想知道是否有像map1.insert(map2.begin(), map2.end());这样的函数强制更新已存在的密钥?

更新: 我知道可以使用:map1[k] = v来完成map2中的所有键值对。

但有没有像map1.insert(map2.begin(), map2.end())这样的功能可以做到这一点?

5 个答案:

答案 0 :(得分:3)

在C ++ 17中,合并然后交换。

map2.merge(map1);
map2.swap(map1);

与基于插入的变体相比,这样做的好处是它只是拼接节点;没有分配,没有任务,没有建设。

答案 1 :(得分:2)

你可以做相反的事情然后交换。

<?php // Assuming your content (the html where those tags are found) is available as $html $doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML($html); // loads your HTML libxml_clear_errors(); // Note: Tag names are case sensitive $text = $dom->getElementsByTagName('taghere'); // Echo the content echo $text

答案 2 :(得分:2)

template<typename MapT>
void join_inplace(MapT& m1, MapT const& m2)
{
    for (auto p : m2)
        m1[p.first] = p.second;
}

Ideone

修改

因为你不关心map2

template<typename MapT>
void join_inplace(MapT& target, MapT& other)
{
    for (auto& p : other)
        target[std::move(p.first)] = p.second;
}

答案 3 :(得分:0)

由于您之后不关心map2的状态,您可以移动其元素

template<typename MapT>
void join_inplace(MapT& map1, MapT &&map2)
{
  for(auto& p : map2)
    map1.insert_or_assign(std::move(p.first), std::move(p.second));
  map2.clear();
}

不要求映射类型是默认可构造的(与基于map::operator[]的解决方案不同)。

答案 4 :(得分:0)

这是一个C ++ 17解决方案,可以避免任何分配,复制或移动(键和映射类型)

template<typename MapT>
void join_inplace(MapT&map1, MapT&&map2)
{
  for(auto it=map1.begin(), end=map1.end(); it!=end;)
    map2.insert(std::move(map1.extract(it++)));
  std::swap(map1,map2);
}

解释。

  1. map::extract(it)提取node,从而使迭代器it无效。因此,我们必须像往常一样通过map1.extract(it++)而不是for循环对迭代器进行后递增。
  2. map::insert(node_type&&)插入节点 iff 该密钥尚未知晓。
  3. 否则节点被销毁
  4. 最后,我们必须交换地图(根据valentindavid&#39; s answer)。
  5. 请注意。在我写这个答案的时候,相当但更简单的answer T.C.出现了。我刚用for循环实现了map::merge()