替换STL映射中的多个元素

时间:2017-02-21 09:33:17

标签: c++ stl stl-algorithm

我需要在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的文档,但在我看来它并不适用于地图。

1 个答案:

答案 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

live wandbox example

这是我提出的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

live wandbox example