目前,我正在获取两个地图的设置差异,然后迭代生成的地图。
理想情况下,我想创建一个差异向量而不是地图。这样,我可以更有效地进行迭代。
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函数中完成吗?
我正在寻找获得差异的最有效方法。
答案 0 :(得分:3)
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>
,以避免不必要的复制。)
答案 1 :(得分:1)
您可以使用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
从std::map::value_comp()
获取默认值,而不是显式地编写它,因为排序条件必须与map和std::set_difference
相匹配:
std::set_difference(map1.begin(), map1.end(), map2.begin(), map2.end(),
std::back_inserter(redundantRegs),
map1.value_comp() );