【问题标题】:Segmentation fault while calculating the intersection of two sets计算两组交集时出现分段错误
【发布时间】:2021-08-31 10:08:03
【问题描述】:

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

#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;
}

【问题讨论】:

  • 你的向量是空的,所以这会尝试将值写入无效索引。你可能想要back_inserter
  • 由于v 为空,v.begin() 返回的结果与无法引用的v.end() 相同。您需要调整矢量v 的大小或使用std::back_inserter 之类的东西。我还建议您阅读有关std::set_intersection 的更多信息。

标签: c++ arrays stl segmentation-fault set


【解决方案1】:

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();
}

【讨论】:

  • 确保你#include &lt;iterator&gt;
  • 我确实试过这个,但它显示了一个错误:没有运算符“=”匹配这些操作数——操作数类型是:__gnu_cxx::__normal_iterator>> = std::back_insert_iterator<:vector std::allocator>>>C/C++(349)
  • @SreyaSalil 好的,这次我真的试过了。固定。
  • @dratenik std::set&lt;int&gt; s1(a, a + n); std::set&lt;int&gt; s2(b, b + m); -- 那么for 循环就不需要了,
【解决方案2】:

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

您需要一个vector 并留出一些空间。将vector&lt;int&gt; v; 更改为vector&lt;int&gt; v(n+m);

https://ideone.com/NvoZBu

【讨论】:

    【解决方案3】:

    我相信你需要提供一个 std::back_inserter(v)。不需要预先分配,但从优化的角度来看它是有帮助的。请参阅

    中的示例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多