C ++库方法用于两个unordered_set的交集

时间:2018-01-08 22:13:50

标签: c++ stl

我有两个unordered_set并希望它们的交集。我无法找到一个库函数来做到这一点。

基本上,我想要的是:

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_intersection,但这似乎仅适用于矢量?

由于

2 个答案:

答案 0 :(得分:4)

事实上,基于循环的解决方案是您可以与std::unordered_set一起使用的最佳选择。

有一种名为std::set_intersection的算法可以找到两个已排序范围的交集:

  

构造一个从元素开始的d_first开始的排序范围   在两个排序范围 [first1,last1]和[first2,   last2)。

当您处理std::unordered_set时,无法应用此算法,因为std::unordered_set中的元素无法保证订单。

我的建议是坚持使用循环,因为它明确说明了你想要达到的目标并具有线性复杂度( O(N),其中 N 是一个使用 for循环遍历的无序集合中的元素,这是您可能实现的最佳复杂性。

答案 1 :(得分:0)

std有一个名为set_intersection的函数。但是,使用std::set作为输入参数会有很高的复杂性。更好的解决方案是,从这些集合中创建两个向量,并使用带有向量的set_intersection作为输入参数。