由于比较功能导致的分段错误

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 进行验证。

Dan*_*anh 5

因为bool comp(activity p, activity q)不符合要求Comparestd::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)