You need to enable JavaScript to run this app. C++计算两个set交集时出现Segmentation fault错误该如何修复?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 23:54:06