分段故障。载体cpp的使用
Segmentation fault. Use of vectors cpp
当我在 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;
}
你用一个大小声明你的向量,然后继续push_back
添加元素
vector<int> v1(n);
for(int i=0;i<n;i++)
{
scanf("%d",&element);
v1.push_back(element);
}
所以如果 n
是 5
,您将有 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;
}
您的代码中有一些问题,但这个问题很突出:
for(int i=0;i<v3.size()+1;i++)
^^^^
// ...
if(v2[k]==v3[i])
^^^^
您尝试对函数不支持的未排序数组进行二分查找。我不确定它是否会导致分段错误,但显然不正确。
当我在 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;
}
你用一个大小声明你的向量,然后继续push_back
添加元素
vector<int> v1(n);
for(int i=0;i<n;i++)
{
scanf("%d",&element);
v1.push_back(element);
}
所以如果 n
是 5
,您将有 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;
}
您的代码中有一些问题,但这个问题很突出:
for(int i=0;i<v3.size()+1;i++)
^^^^
// ...
if(v2[k]==v3[i])
^^^^
您尝试对函数不支持的未排序数组进行二分查找。我不确定它是否会导致分段错误,但显然不正确。