从两个地图创建set_difference矢量

Create a set_difference vector from two maps

本文关键字:set 创建 difference 矢量 地图 两个      更新时间:2023-10-16

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

理想情况下,我想创建一个差异向量而不是地图。这样我就可以更有效地迭代。

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函数中完成吗?

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

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<int, Info>更改为std::pair<const int, Info>以避免不必要的副本。

您可以使用std::set_difference但与其使用std::inserter不如使用std::back_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() );

现场示例