代码之家  ›  专栏  ›  技术社区  ›  radschapur

两个无序\u集求交的C++库方法

  •  16
  • radschapur  · 技术社区  · 8 年前

    我有两个无序的\u集,想要它们的交点。我找不到一个库函数来实现这一点。

    本质上,我想要的是:

    unordered_set<int> a = {1, 2, 3};
    unordered_set<int> b = {2, 4, 1};
    
    unordered_set<int> c = a.intersect(b); // Should be {1, 2}
    

    我可以这样做

    unordered_set<int> c;
    for (int element : a) {
      if (b.count(element) > 0) {
        c.insert(element);
      }
    }
    

    但我认为应该有一个更方便的方法来做到这一点?如果没有,有人能解释一下原因吗?我知道有set\U交叉,但这似乎只对向量起作用?

    谢谢

    2 回复  |  直到 8 年前
        1
  •  15
  •   Edgar Rokjān    8 年前

    事实上,基于循环的解决方案是您可以使用的最好的解决方案 std::unordered_set .

    有一种算法叫做 std::set_intersection 可以找到两个的交点 已排序 范围:

    构造从d\u开始的排序范围,首先由元素组成 可在中找到 两个排序范围 [第一个1,最后一个1)和[第一个2, 最后2)。

    当你处理 std::无序\u集 无法应用 此算法是因为 std::无序\u集 .

    我的建议是坚持使用循环,因为它明确说明了您想要实现的目标,并且具有线性复杂性( O(N) 哪里 N 是使用 for循环 )这是您可能达到的最佳竞争力。

        2
  •  -3
  •   Onur A.    8 年前

    有一个函数来自 std 打电话 set_intersection . 然而,将其用于 std::set 作为输入参数。。更好的解决方案是,从这些集合中创建两个向量并使用 set\u交点 使用向量作为输入参数。