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

std::set_intersection is for sorted ranges as [ _ ] is for unsorted ranges/containers

本文关键字:范围 用于 排序 容器 std set intersection      更新时间:2023-10-16

std::set_intersection采用排序的元素范围(好吧,迭代器对)。但假设我有未排序的数据,例如两个std::unordered_set。有标准的设施来交叉它们吗?

我不知道C++11中有这样的函数。答案是"不"。

在这种情况下没有快捷方式。您应该检查较小集合中的每个元素在较大集合中的成员身份,如果找到了,则将其插入到输出集合中。由于unordered_set是使用带有bucket的散列来实现的,因此查找时间应该很短(具有良好的散列函数和合理的散列最大加载量)。您应该能够在较小的集合上编写对for_each的调用,该调用对较大的集合执行检查并插入到输出集合中,而不会变得太难看。

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

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

据我所知,没有一个固定的库函数只为你做这件事。