Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何合并2个std::maps,并在第3个map中输出结果_C++_C++11 - Fatal编程技术网

C++ 如何合并2个std::maps,并在第3个map中输出结果

C++ 如何合并2个std::maps,并在第3个map中输出结果,c++,c++11,C++,C++11,编辑原始问题,因为我想问关于std::map的问题,而不是std::vector。我的错误。对不起 我的数据实际上在2std::maps中。我想将两个地图合并到第三个地图中 我的第一个和第二个映射包含具有相同密钥的条目。所以我想把这些键下的数据也合并到我的第三张地图中 因此,如果我使用std::merge,我会从第一个或第二个映射公共条目中丢失数据吗?正如我所提到的,两个映射中都有相同的数据(值)Info用于顺序容器 如果对vectors(或其他顺序容器,如list或deque)进行了排序,则可

编辑原始问题,因为我想问关于
std::map
的问题,而不是
std::vector
。我的错误。对不起

我的数据实际上在2
std::map
s中。我想将两个地图合并到第三个地图中

我的第一个和第二个映射包含具有相同密钥的条目。所以我想把这些键下的数据也合并到我的第三张地图中

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

Info用于顺序容器 如果对
vector
s(或其他顺序容器,如
list
deque
)进行了排序,则可以使用。如果要保存重复项,则有一个

代码取自链接页面

#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';
}
#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';
}
输出(第一个数字是键,第二个-它来自哪个映射):1:12:13:14:15:16:27:2

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

多重贴图示例(两个贴图中的条目都保留)

#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';
}
#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';
}
#包括
#包括
int main()
{
映射v1={1,1},{2,1},{3,1},{4,1},{5,1};
映射v2={3,2},{4,2},{5,2},{6,2},{7,2};
std::multimap dest1{v1.begin(),v1.end()};
dest1.insert(v2.begin(),v2.end());
用于(常数自动和输入:dest1){
std::cout这就是它的用途:


我相信你想要的是一种既能融合地图又能融合地图内容的东西

template<class Map, class Merge>
Map careful_merge( Map lhs, Map const& rhs, Merge&& merge ) {
  for (auto&& rhs_entry : rhs) {
    auto lhs_it = lhs.find(rhs_entry.first);
    if (lhs_it == lhs.end()) {
      lhs.insert( rhs_entry );
      continue;
    }
    auto& lhs_value = lhs_it.second;
    lhs_value = merge(std::move(lhs_value), rhs.second);
  }
  return lhs;
}
我们完成了

左侧或右侧唯一的条目永远不会合并,只是逐字复制到输出中

假设了有效的移动语义


它可以处理有序映射和无序映射。它不能处理集合。我建议不要在多映射上使用它,即使它可以工作(我不确定),因为它不是为它们设计的。

注意,从C++17开始,现在有了
std::map::merge(other_map)
方法


请参见

?各个向量中是否存在重复项?在阅读了对另一个答案的评论后,我注意到您并没有询问您真正的问题,而是询问您试图解决它的方法。这通常被称为。请编辑问题并包括原始问题。合并两个
std::map
s可以更轻松、更快速地完成三、左轮手枪建议编辑的原始问题_Ocelot@XMarshall:请不要以使答案无效的方式编辑问题。这些人回答了您写的问题。如果这些问题不能解决您的问题,请创建一个新问题,而不是编辑使其无效。
std::merge
不会消除重复项。@AnonMai请把问题读清楚:“没有重复”我读了。只是“没有重复”不是100%清楚是指。谢谢。我在问这个问题时犯了一个很大的错误。我的数据实际上是在2个std::maps中。很抱歉这个错误。因此,如果我使用std::merge,我会从第一个或第二个maps中丢失数据吗?有公共数据(键)在两个地图中。使用
std::merge
你不会丢失任何东西。使用
std::set\u union
你会丢失重复项。不清楚保留了哪些项目,但如果它们确实是重复项,那就不重要了。
std::set\u symmetric-difference
不会做你想做的事。谢谢。在我的情况下,它有点复杂。我已经有了ve 2映射包含数据。映射中的关键是一个字符串,对应的数据是一个结构,该结构又包含一些其他数据。现在,使用上述方法,我在映射中的迭代和应用业务逻辑是否有效?两个映射中包含的数据量也非常大。但是,在处理结果时ltant第三张也是最后一张地图,我将知道前两张地图的大小。@XMarshall,如果您的目的是让第三张地图充满前两张地图的数据的唯一副本,而不改变原始地图,那么是的,这将是最有效的解决方案。如果您不关心原始地图的内容,您只需将第二张地图插入第一张地图,然后我就可以了如果数据已启用移动,则在第二个地图上迭代,将内容移动到第一个地图上。
using my_map = std::map< std::string, std::vector<int> >;
my_map a, b; // fill these somehow.
my_map result = careful_merge( a, b,
  [](std::vector<int> lhs, std::vector<int> const& rhs ) {
    lhs.insert(lhs.end(), rhs.begin(), rhs.end());
    return std::move(lhs);
  }
);