【问题标题】:std::set_intersection is for sorted ranges as [ _ ] is for unsorted ranges/containersstd::set_intersection 用于排序范围,因为 [ _ ] 用于未排序范围/容器
【发布时间】:2016-05-03 15:44:29
【问题描述】:

std::set_intersection 采用已排序的元素范围(嗯,迭代器对)。但是假设我有未排序的数据,例如两个std::unordered_sets。是否有标准设施让它们相交?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    我知道没有罐头库函数可以为你做这件事。

    【讨论】:

    • 这会给你联合,而不是交集,并且会做到这一点的函数是s1.insert(s2.begin(), s2.end())
    • 布拉格。非常感谢。分心思考它并回答了错误的问题。我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2021-01-14
    • 2018-03-29
    • 2014-01-30
    相关资源
    最近更新 更多