我需要在STL map
中替换多个值,但我在<algorithm>
中找不到任何有用的内容。
伪代码:
Input:
map<type1, type2> m1;
m1[k1] = v1;
m1[k2] = v2;
m1[k3] = v3;
map<type1, type2> m2;
m2[k1] = v5;
m2[k3] = v4;
Action:
merge(m1, m2)
Output:
m1[k1] = v5;
m1[k2] = v2;
m1[k3] = v4;
当密钥匹配时,merge
方法应将m1
值替换为m2
值。
我阅读了merge的文档,但在我看来它并不适用于地图。
答案 0 :(得分:3)
C ++ 17添加了std::map::merge
,它可以满足您的需求:
template<class C2> void merge(std::map<Key, T, C2, Allocator>& source);
尝试提取(&#34; splice&#34;)源中的每个元素,并使用* this的比较对象将其插入到*中。如果* this中有一个元素,其中的键等效于源中元素的键,则该元素不会从源中提取。没有复制或移动元素,只重新定位容器节点的内部指针。所有指向转移元素的指针和引用仍然有效,但现在引用* this,而不是引入源。
示例:
map<std::string, int> m1;
m1["k1"] = 1;
m1["k2"] = 2;
m1["k3"] = 3;
map<std::string, int> m2;
m2["k1"] = 5;
m2["k3"] = 4;
m2.merge(m1);
for(const auto& p : m2)
{
std::cout << p.first << " -> " << p.second << "\n";
}
将打印:
k1 -> 5
k2 -> 2
k3 -> 4
这是我提出的C ++ 14解决方案:
template <typename TMap0, typename TMap1>
auto merge(TMap0&& m0, TMap1&& m1)
{
using map_type = std::remove_reference_t<TMap0>;
// Move or copy `m0` into `result`.
map_type result(std::forward<TMap0>(m0));
// For each pair in `m1`...
for(auto&& p : m1)
{
// If `m0` contains the key `p.first`...
if(m0.count(p.first) != 0)
{
// Move or copy `p.second` into `result`.
result[p.first] = forward_like<TMap1>(p.second);
}
}
return result;
}
(forward_like
can be found here。)
示例:
map<std::string, int> m1;
m1["k1"] = 1;
m1["k2"] = 2;
m1["k3"] = 3;
map<std::string, int> m2;
m2["k1"] = 5;
m2["k3"] = 4;
auto res = merge(m1, m2);
for(const auto& p : res)
{
std::cout << p.first << " -> " << p.second << "\n";
}
将打印:
k1 -> 5
k2 -> 2
k3 -> 4