Aka*_*arg 3 c++ segmentation-fault
我尝试在 spoj 上解决这个问题。http://www.spoj.com/problems/BUSYMAN/
虽然我能够解决它,但我遇到了一个非常奇怪的错误。我试图了解它的原因,但失败了。我有两个代码。
///////////////////////////////////////////////// /
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class activity
{
public:
int start,end;
};
bool comp(activity p, activity q)
{
if(p.end<q.end)return true;
if(p.end==q.end&&p.start<=q.start)return true;
return false;
}
int main()
{
int t;
cin>>t;
vector<activity> v;
for(int i=0;i<t;i++)
{
int n;
cin>>n;
v.resize(n);
for(int j=0;j<n;j++)cin>>v[j].start>>v[j].end;
sort(v.begin(),v.end(),comp);
int ans=0,currend=0;
for(int j=0;j<n;j++)
{
if(v[j].start>=currend){ans++;currend=v[j].end;
}
}
cout<<ans<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
/////////////////////////////////////////////
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class activity
{
public:
int start,end;
};
bool comp(activity p, activity q)
{
if(p.end<q.end)return true;
if(p.end==q.end&&p.start>=q.start)return true;
return false;
}
int main()
{
int t;
cin>>t;
int n;
vector<activity> v;
for(int i=0;i<t;i++)
{
cin>>n;
v.resize(n);
for(int j=0;j<n;j++)
cin>>v[j].start>>v[j].end;
sort(v.begin(),v.end(),comp);
int ans=0,currend=0;
for(int j=0;j<n;j++)
{
if(v[j].start>=currend)
{
ans++;currend=v[j].end;
}
}
cout<<ans<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
//////////////////////////////
我的问题是第一个在 spoj 上给出分段错误,而第二个没有。两者之间的唯一区别是比较函数。我只是碰巧以两种相似的不同方式定义了比较函数的第二个语句。但它在第一种情况下给了我分段错误,但在第二种情况下不会。
在上面的两张图片中,有两个代码具有各自的提交 ID,在第三张图片中,它显示了一个的段错误,而另一个则没有。您也可以使用我的 spoj 个人资料中的提交 ID 进行验证。
因为bool comp(activity p, activity q)不符合要求Compare看std::sort
应该是这样的:
bool comp(const activity& p, const activity& q)
{
return p.end < q.end || (p.end ==q.end && p.start < q.start);
}
Run Code Online (Sandbox Code Playgroud)
或者
struct comp {
bool operator()(const activity& p, const activity& q) const
{
return p.end < q.end || (p.end ==q.end && p.start < q.start);
}
};
Run Code Online (Sandbox Code Playgroud)
或者
struct comp {
bool operator()(const activity& p, const activity& q) const
{
return std::tie(p.end, p.start) < std::tie(q.end, q.start);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |