【问题标题】:Segmentation fault. Use of vectors cpp [closed]分段故障。使用向量 cpp [关闭]
【发布时间】:2015-06-30 19:10:57
【问题描述】:

当我在 SPOJ 中提交以下代码时,它给出了运行时错误。虽然它在我的编译器上运行良好。可能是由于测试用例什么的。我是comp编程的新手。请帮我找出错误。 问题是: http://www.spoj.com/problems/ANARC05B/en/ 输入始终按排序顺序排列。 这是我的代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    while(1)
    {
    int n;
    scanf("%d",&n);
    if(n==0)
        return 0;
    int element;
    vector<int> v1(n);
    for(int i=0;i<n;i++)
    {
      scanf("%d",&element);
      v1[i]=element;
    }
    int m;
    scanf("%d",&m);
    vector<int> v2(m);
    for(int i=0;i<m;i++)
    {
        scanf("%d",&element);
        v2[i]=element;
    }
    vector<int> v3; //vector of common elements
    int j=0;
    if(m>n)
    {
        for(int i=0;i<n;i++)
        {
           if(binary_search(v2.begin(),v2.end(),v1[i]))
           {
               v3.push_back(v1[i]);
           }
        }
    }
    else if(n>=m)
    {
        for(int i=0;i<m;i++)
        {
           if(binary_search(v1.begin(),v1.end(),v2[i]))
           {
               v3.push_back(v2[i]);
           }
        }
    }
    vector<int> v4;  //vector of sum of parts upto common elements in v1
    j=0;
    int k;
    int sum;
    for(int i=0;i<v3.size()+1;i++)
    {
        sum=0;
        for(k=j;k<v1.size();k++)
        {
           sum=sum+v1[k];
           if(v1[k]==v3[i])
                break;
        }
        j=k+1;
        v4.push_back(sum);
    }
    vector<int> v5;  //vector of sum of parts upto common elements in v2
    j=0;
    for(int i=0;i<v3.size()+1;i++)
    {
        sum=0;
        for(k=j;k<v2.size();k++)
        {
           sum=sum+v2[k];
           if(v2[k]==v3[i])
                break;
        }
        j=k+1;
        v5.push_back(sum);
    }
    sum=0;
    for(int i=0;i<v4.size();i++)
    {
        if(v4[i]>v5[i])
            sum=sum+v4[i];
        else
            sum=sum+v5[i];
    }
    cout<<sum<<endl;
}
return 0;
}

【问题讨论】:

  • 你试过调试你的代码吗?
  • scanf("%d",&amp;n);if(n==0) return 0; 对于用户想要输入零的情况,您有什么想法?
  • binary_search 不能很好地处理未排序的数据。还要看看使用std::set_intersection
  • 我的票数不高,但以下内容肯定适用:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。“
  • @πάνταῥεῖ 你的票数用完了!? ಠ_ಠ

标签: c++ vector segmentation-fault


【解决方案1】:

您的代码中存在一些问题,但这一点很突出:

for(int i=0;i<v3.size()+1;i++)
                      ^^^^
        // ...
        if(v2[k]==v3[i])
                   ^^^^

【讨论】:

  • 非常感谢先生。有交流电。
【解决方案2】:

你用大小声明你的向量,然后继续push_back添加元素

vector<int> v1(n);
for(int i=0;i<n;i++)
{
  scanf("%d",&element);
  v1.push_back(element);
}

因此,如果 n5,您将有 10 个元素。 5 个被初始化,然后 5 个被推回。

{0, 0, 0, 0, 0, 1, 2, 3, 4, 5}
 ^initialized   ^push_back

你应该reserve

vector<int> v1;
v1.reserve(n);
for(int i=0;i<n;i++)
{
  scanf("%d",&element);
  v1.push_back(element);
}

或者用正确的尺寸声明,然后使用operator[]

vector<int> v1(n);
for(int i=0;i<n;i++)
{
  scanf("%d",&element);
  v1[i] = element;
}

【讨论】:

  • 我不会投反对票,因为它是代码中的一个合法错误,但问题是关于段错误,我不认为这是它的来源(另一个答案提供了一个合理的对此的解释)。
  • 感谢您指出这个错误。
【解决方案3】:

您尝试对函数不支持的未排序数组进行二进制搜索。我不确定它是否会导致分段错误,但它显然是不正确的。

【讨论】:

  • 输入总是有序的。已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多