std :: set_intersection用于排序范围,[_]用于未排序范围/容器

时间:2016-05-03 15:44:30

标签: c++ intersection sorted idiomatic unordered-set

std::set_intersection获取元素的排序范围(以及迭代器对)。但是假设我有未分类的数据,例如两个std::unordered_set。有交叉的标准设施吗?

2 个答案:

答案 0 :(得分:2)

我不知道C ++ 11中有任何这样的功能。答案是“不”。

答案 1 :(得分:1)

在这种情况下没有捷径。您应该检查较小集合中的每个元素是否为较大集合中的成员资格,并将其插入到输出集中(如果已找到)。由于unordered_set是使用带桶的散列实现的,因此查找时间应该(具有合适的散列函数和合理的散列最大加载)很小。您应该能够在较小的集合上编写对for_each的调用,该集合对较大的集合执行检查,并且插入到输出集合中而不会变得太难看。

如果要在两个原始集之一中构建交集,可以检查其每个元素是否在另一个集合中,如果不是,则删除该元素。这可以使用remove_if写入将保存结果的unordered_set。

另一种选择是将copy_if与插入迭代器一起使用。在相同的时间和空间内有很多选择。选择一个似乎为了清晰度而优化的方法。

我知道没有罐头库功能可以为你做。