从两个地图创建一个 set_difference 向量

Posted

技术标签:

【中文标题】从两个地图创建一个 set_difference 向量【英文标题】:Create a set_difference vector from two maps 【发布时间】:2019-06-05 18:49:04 【问题描述】:

目前我正在获取两个地图的集合差异,然后遍历生成的地图。

理想情况下,我想创建差异向量而不是地图。这样我的迭代效率更高。

typedef std::map<int, Info> RegistrationMap;

RegistrationMap redundantRegs;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
std::inserter(redundantRegs, redundantRegs.begin()),
    [](const std::pair<int, Info> &p1, const std::pair<int, Info> &p2 return p1.first < p2.first;);

for (auto reg : redundantRegs)

    map2[hiu.first].Status = "delete";

您将如何创建集合差异的向量?这可以在 set_difference 函数中完成吗?

我正在寻找获得差异的最有效方法。

【问题讨论】:

【参考方案1】:

std::set_difference可以将其输出写入任何输出迭代器,因此将输出写入向量是没有问题的:

std::vector<std::pair<int, Info>> redundantRegs;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(),
                    std::back_inserter(redundantRegs),
                    ...);

(注意:在您的比较器中,将std::pair&lt;int, Info&gt; 更改为std::pair&lt;const int, Info&gt; 以避免不必要的复制。)

【讨论】:

最好使用RegistrationMap::value_type 而不是明确使用std::pair【参考方案2】:

您可以使用std::set_difference,但最好使用std::back_inserter 而不是std::inserter,因为这对std::vector 最有效,并相应地创建std::vector

std::vector<RegistrationMap::value_type> redundantRegs;;
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
                    std::back_inserter(redundantRegs) );

注意:在您编写它的方式中,您不需要显式编写比较器,默认的比较器可以正常工作。如果不使用默认值,最好使用std::map::value_comp()std::map 获取它,而不是显式编写它,因为排序条件必须与map 和std::set_difference 匹配:

std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(), 
                    std::back_inserter(redundantRegs),
                    map1.value_comp() );

Live example

【讨论】:

以上是关于从两个地图创建一个 set_difference 向量的主要内容,如果未能解决你的问题,请参考以下文章

set_difference、set_intersection 和 set_union 的就地版本

Tilemaps 地图创建 1

includes,set_union,set_intersection,set_difference

使用链接地图/传递映射/链式地图的 AutoMapper 地图

如何删除在 for 循环中创建的注释

谷歌地图没有从数据库中提取我的标记