c – 如何合并2个std :: maps,并将结果输出到第3个映射中

编辑原始问题,因为我想问一下关于std :: map的问题,而不是std :: vector.我的错.抱歉.

我的数据实际上是2 std :: maps.我想将两张地图合并到第三张地图中.

我的第一张和第二张地图包含具有相同键的条目.所以我想将这些键下的数据合并到我生成的第3张地图中.

所以如果我使用std :: merge,我会丢失第一个或第二个映射公共条目的数据吗?正如我所提到的,两张地图都有共同的数据(值)?

解决方法

顺序容器的信息

如果向量(或列表或双端队列等其他顺序容器)进行排序,则可以使用std::set_union.如果要保存重复项,则为std::merge

从链接页面获取的代码:

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<int> v1 = {1,2,3,4,5}; 
    std::vector<int> v2 = {      3,5,6,7}; 
    std::vector<int> dest1;

    std::set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),std::back_inserter(dest1));

    for (const auto &i : dest1) {
        std::cout << i << ' ';
    }   
    std::cout << '\n';
}

输出:1 2 3 4 5 6 7

关联容器的信息

您可以使用insert方法向地图(或集合及其无序对应项)添加唯一键.原始地图中已存在的任何密钥都不会被替换(在多重插图和多地图重复键中将添加,如果应该避免,请使用之前讨论过的set_union).

映射示例(忽略具有重复键的条目):

#include <map>
#include <iostream>

int main()
{
    std::map<int,int> v1 = {{1,1},{2,{3,{4,{5,1}};
    std::map<int,int> v2 = {                {3,2},{6,{7,2}};
    std::map<int,int> dest1 = v1;

    dest1.insert(v2.begin(),v2.end());

    for (const auto &i : dest1) {
        std::cout << i.first << ':' << i.second << ' ';
    }
    std::cout << '\n';
}

输出(第一个数字是关键,第二个 – 它来自哪个地图):1:1 2:1 3:1 4:1 5:1 6:2 7:2

如果您切换地图(将dest1设置为开头的v2副本和v1的inser值),则输出将为:1:1 2:1 3:2 4:2 5:2 6:2 7:2

多映射的示例(保留两个映射的条目):

#include <map>
#include <iostream>

int main()
{
    std::map<int,2}};
    std::multimap<int,int> dest1 {v1.begin(),v1.end()};

    dest1.insert(v2.begin(),v2.end());

    for (const auto &i : dest1) {
        std::cout << i.first << ':' << i.second << ' ';
    }
    std::cout << '\n';
}

输出:1:1 2:1 3:1 3:2 4:1 4:2 5:1 5:2 6:2 7:2

请注意,您不能使用与地图完全相同的多地图.例如,operator []是不可用的.您将需要使用insert来添加条目,并使用lower_bound或equal_range成员函数来提取条目.

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...