set_intersection具有重复值

Set_Intersection with repeated values

本文关键字:intersection set      更新时间:2023-10-16

我认为set_intersection stl函数在此处描述:http://www.cplusplus.com/reference/reference/algorithm/set_intersection/在数学意义上并不是真正的相交。假设给出的示例我更改了行:

int first[] = {5,10,15,20,20,25};
int second[] = {50,40,30,20,10,20};

结果,我想获得10 20 20。但是我只得到独特的答案。STL中是否有真实的相交?

我知道合并和set_differences的结合,顺便说一句。只是检查我是否缺少明显的东西。

结果,我想获得10 20 20。但是我只得到独特的答案。STL中是否有真实的相交?

std::set_intersection的工作方式。

您可能会得到错误的答案,因为您没有正确更新代码。如果将集合更改为具有6个元素,则需要更新排序它们的行:

std::sort (first,first+5);   // should be first+6
std::sort (second,second+5); // should be second+6

,还将呼叫更改为set_intersection以使用first+6second+6。否则,您只能对每组的前5个元素进行排序,并且仅获取前5个元素的交点。

显然,如果您不在输入中包含重复值,则不会在输出中。如果您正确更改代码以包含所有输入值,则它将按照您的需求工作(实时示例)。

cplusplus.com不是一个很好的参考,如果您查看http://en.cppreference.com/w/cpp/algorithm/set_intersection,您会看到它清楚地说明了重复元素的行为:

如果在[FIRST1,LAST1)和[FIRST2,LAST2)中找到了某些元素,则第一个std::min(m, n)元素将从第一个范围复制到目标范围。

即使是cplusplus.com上的示例也很糟糕,如果它是用惯用的现代c 编写的,它会更简单,并且很难介绍您的错误:

#include <iostream>     // std::cout
#include <algorithm>    // std::set_intersection, std::sort
#include <vector>       // std::vector
int main () {
  int first[] = {5,10,15,20,20,25};
  int second[] = {50,40,30,20,10,20};
  std::sort(std::begin(first), std::end(first));
  std::sort(std::begin(second), std::end(second));
  std::vector<int> v;
  std::set_intersection(std::begin(first), std::end(first),
                        std::begin(second), std::end(second),
                        std::back_inserter(v));                                               
  std::cout << "The intersection has " << v.size() << " elements:n";
  for (auto i : v)
    std::cout << ' ' << i;
  std::cout << 'n';
}

这将自动处理正确的元素,而无需明确说56或任何其他魔术号码,而无需在输出向量中创建初始元素,然后将其调整大小以再次删除它们。

set_intersection都需要对两个范围进行排序。在您给出的数据中,second未排序。

如果首先排序,则应该得到预期的答案。