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

XMa*_*all 7 c++ c++11

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

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

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

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

Rev*_*lot 15

顺序容器的信息

如果vectors(或其他顺序容器如listor deque)被排序,那么你可以使用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, 4, 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';
}
Run Code Online (Sandbox Code Playgroud)

输出:1 2 3 4 5 6 7

关联容器的信息

您可以使用方法向map(或set它们的无序对应物)添加唯一键insert.任何在原始地图已经存在的键不会被替换(在multisetmultimap重复键将被添加,使用set_union,如果这应该避免讨论过).

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

#include <map>
#include <iostream>

int main()
{
    std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}};
    std::map<int, int> v2 = {                {3, 2}, {4, 2}, {5, 2}, {6, 2}, {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';
}
Run Code Online (Sandbox Code Playgroud)

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

如果你切换地图(设置dest1v2开头和inser值的副本v1),那么输出将是:1:1 2:1 3:2 4:2 5:2 6:2 7:2

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

#include <map>
#include <iostream>

int main()
{
    std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}};
    std::map<int, int> v2 = {                {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 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';
}
Run Code Online (Sandbox Code Playgroud)

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

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