所以我知道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())
这样的功能可以做到这一点?
答案 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;
}
修改
因为你不关心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);
}
解释。
map::extract(it)
提取node,从而使迭代器it
无效。因此,我们必须像往常一样通过map1.extract(it++)
而不是for
循环对迭代器进行后递增。 map::insert(node_type&&)
插入节点 iff 该密钥尚未知晓。请注意。在我写这个答案的时候,相当但更简单的answer T.C.出现了。我刚用for循环实现了map::merge()
。