C++计算两个set交集时出现Segmentation fault错误该如何修复?
错误根因
你代码的段错误由std::set_intersection的非法写入触发:std::set_intersection要求传入的目标输出迭代器指向的内存有足够空间存储交集结果,你定义的vector<int> v是未分配存储的空容器,直接用v.begin()作为写入目标会访问非法内存,触发段错误。
修复方法
最简单的修复是用std::back_inserter代替v.begin()作为输出迭代器,它会自动给vector扩容,不需要提前计算分配空间:
将原代码中set_intersection调用行修改为:
it = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v));
如果不想引入迭代器适配器,也可以提前给vector预分配足够空间:
v.resize(min(s1.size(), s2.size())); it = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), v.begin());
更优实现(可选)
你不需要额外创建vector存储交集元素,直接遍历其中一个set判断元素是否存在于另一个set计数即可,内存开销更低:
int NumberofElementsInIntersection (int a[], int b[], int n, int m ){ set<int> s1(a, a+n); int count = 0; for(int i=0;i<m;i++){ if(s1.count(b[i])){ count++; s1.erase(b[i]); // 去重,避免b数组重复元素多次计数 } } return count; }
修复后完整可运行代码
#include<iostream> #include<algorithm> #include<vector> #include<set> using namespace std; int NumberofElementsInIntersection (int a[], int b[], int n, int m ){ set<int> s1,s2; vector<int> v; vector<int>::iterator it; for(int i=0;i<n;i++) s1.insert(a[i]); for(int i=0;i<m;i++) s2.insert(b[i]); it=set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(v)); 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; }
内容的提问来源于stack exchange,提问作者Sreya Salil
相关产品推荐
相关产品推荐

