std::set_intersection 用于排序范围,因为 [_] 用于未排序 ranges/containers

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

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

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

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

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

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

据我所知,没有任何固定库函数可以为您完成。