有没有办法使用std :: copy复制非冲突的地图值?

时间:2013-06-20 04:49:35

标签: c++ stl stdmap

我正在寻找一种方法将值从一个地图复制到另一个地图,类似于this question,但我不希望第二个地图覆盖冲突的值,我希望保留原始值不变。

例如,如果我有两张地图{a: 1, b: 2},并且我将{b: 3, c: 4}复制到其中,则第一张地图会被修改为{a: 1, b: 2, c: 4}

有没有办法使用标准库函数执行此操作,还是需要通过迭代手动执行此操作并检查冲突的值?

2 个答案:

答案 0 :(得分:3)

map.insert的版本需要两个迭代器。如果项目(键)已经存在于目标地图中,则插入失败,因此这完全符合您的要求。

#include <iostream>
#include <map>

int main() { 
    std::map<char, int> stuff;

    stuff['a'] = 1;
    stuff['b'] = 2;

    std::map<char, int> stuff2;

    stuff2['b'] = 3;
    stuff2['c'] = 4;

    stuff.insert(stuff2.begin(), stuff2.end());

    for (auto i : stuff)
        std::cout << i.first << "\t" << i.second << "\n";
}

结果:

a       1
b       2
c       4

答案 1 :(得分:0)

您可以使用std::for_each和lambda:

执行此操作
std::map<int, int> m1 = ...;
std::map<int, int> m2 = ...;

std::for_each(m2.begin(), m2.end(),
             [&m1](const std::pair<const int, int>& a)
             {
                 if(m1.find(a.first) == m1.end())
                    m1.insert(a);
             });

实际上,这只是将您必须手动捆绑到std::for_each和lambda中。据我所知,没有任何更好的方法可以达到你想要达到的目的。

如果您的编译器支持emplace(GCC 4.7不支持,但4.8支持),那么您可以使用它:

std::for_each(m2.begin(), m2.end(),
             [&m1](const std::pair<const int, int>& a)
             {
                 m1.emplace(a.first, a.second);
             });

emplace将保留元素,只有在前一个元素不存在时才构造新元素。