计算两个集合的交集时出现分段错误



我需要找到两个数组的交集,并打印出两个数组交集中的元素数量。我还必须考虑到两个数组中的任何重复元素。因此,我决定处理重复的元素,将两个数组转换为集合,然后取两个集合的交集。然而,当我运行代码时,我遇到了分段错误。我不确定这是在哪里发生的,有什么办法可以解决吗?

#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
int NumberofElementsInIntersection (int a[], int b[], int n, int m ){
// Your code goes here
int i=0,j=0,count=0;
set<int> s1,s2;
vector<int> v;
vector<int>::iterator it;
for(i=0;i<n;i++)
s1.insert(a[i]);
for(i=0;i<m;i++)
s2.insert(b[i]);
it=set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),v.begin());
return (it-v.begin());
}
int main(){
int a[] = {1, 2, 3, 4, 5, 6};
int b[] = {3, 4, 5, 6, 7};
cout<<NumberofElementsInIntersection(a,b,6,5);
return 0;
}

请参阅https://en.cppreference.com/w/cpp/algorithm/set_intersection

向量迭代器不会调整向量的大小以添加新元素。您应该使用back_inserter

//also needs #include <iterator>
int NumberofElementsInIntersection (int a[], int b[], int n, int m ){
// Your code goes here
int i=0;
set<int> s1,s2;
vector<int> v;
for(i=0;i<n;i++)
s1.insert(a[i]);
for(i=0;i<m;i++)
s2.insert(b[i]);
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(v));
return v.size();
}

set_intersection不分配内存:https://en.cppreference.com/w/cpp/algorithm/set_intersection

你需要一个有一定空间的vector。将vector<int> v;更改为vector<int> v(n+m);

https://ideone.com/NvoZBu

我认为您需要提供一个std::back_inserter(v(。不需要预先分配,但从优化的角度来看,这是有帮助的。参见中的示例

https://en.cppreference.com/w/cpp/algorithm/set_intersection

相关内容

  • 没有找到相关文章

最新更新