如何连接两个c ++映射

时间:2010-06-09 11:17:54

标签: c++ map

任何人都知道如何连接这两张地图:

map<string, map<string,string>> map1;
map<string, map<string,string>> map2;

我只想将map2添加到map1,并将所有元素保留在map1中,即在map2的末尾添加map1。 我试过了map1.insert(map2.begin(), map2.end())但是它没有用,因为它覆盖了map1中的旧元素。

6 个答案:

答案 0 :(得分:5)

如果你只想合并它们但是在碰撞的情况下保留map1中的元素,那么只需反转地图:

std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());

这当然假设在合并之后,您只对结果感兴趣并且在旧集合中更长。

答案 1 :(得分:4)

地图&LT;&GT;一个键只能包含一个值。例如,尝试使用multimap<>

答案 2 :(得分:1)

这个问题与地图的概念相矛盾。如果您在地图中插入一个值,您希望它位于“正确的位置”,具体取决于它的关键字。这意味着每个密钥只有一个条目。

相反,您可以使用vector< pair< mymap::key, myamap::value > >并将其填入第一个resp的条目。第二张地图。

map< string, int > map1, map2;
... fill the maps
vector< pair<string, int> > concatted;
concatted.insert( map1.begin(), map1.end() );
concatted.insert( map2.begin(), map2.end() );

答案 3 :(得分:1)

使用简单的for循环执行:(通过我喜欢使用合理的stl算法):

for(std::map<...>::const_iterator it = map2.begin(), it_end = map2.end(); it != it_end; ++it)
   map1.insert(*it);

任何其键已经在map1 中的元素都不会被覆盖,因为map::insert不会覆盖。

答案 4 :(得分:1)

如果地图不是太大,请执行相反的操作:

map2.insert(map1.begin(), map1.end());
map1 = map2;

这会覆盖map2中的重复值,但会保留map1中的重复值(我明白这就是您想要的)。

答案 5 :(得分:0)

由于C++17 std::map提供了merge()成员函数,因此您可以简单地调用map1.merge(map2);。请注意,地图是按其键排序的,因此不必在末尾附加元素。另外,由于映射中的键是唯一的,因此并非map2中的所有元素都可以插入map1中。完整示例:

int main() {
    std::map<std::string, std::map<std::string, std::string>> map1{
        {"a", {{"b", "b"}}}, {"b", {{"c", "c"}}}
    };

    std::map<std::string, std::map<std::string, std::string>> map2{
        {"b", {{"x", "x"}}}, {"c", {{"y", "y"}}}
    };

    map1.merge(map2);  // C++17

    std::cout << "map1:" << std::endl;
    for (auto const &kv : map1)
        std::cout << kv.first << ": " << kv.second.begin()->first << std::endl;

    std::cout << std::endl << "map2:" << std::endl;
    for (auto const &kv : map2)
        std::cout << kv.first << ": " << kv.second.begin()->first << std::endl;

    return 0;
}

输出:

  

map1:
  a:b
  b:c
  c:y

     

map2:
  b:x

如您所见,键重叠时,merge()不会覆盖目标映射map1中的现有元素。如果要优先考虑map2中的元素,则必须调用map2.merge(map1);。您还可以看到,merge()将条目从源映射中移出。无法合并的元素保留在map2中。

Code on Coliru