sort函数C ++分段错误

时间:2009-10-09 04:35:00

标签: c++ sorting segmentation-fault

在此代码中,对于矢量大小,n> = 32767,它给出了分段错误,但是高达32766,它运行正常。可能是什么错误?这是完整的代码。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<utility>
#include<algorithm>
#include<sys/time.h>
using namespace std;
#define MAX 100000

bool compare(pair<int,int> p1,pair<int,int> p2) {
    if(p1.second < p2.second)
        return 1;
    else if(p1.second > p2.second)
        return 0;
    if(p1.first <= p2.first)
        return 1;
    else
        return 0;
}

int main() {
    freopen("randomin.txt","r",stdin);
    int n;
    scanf("%d",&n);
    vector< pair<int,int> > p(n);
    for(int i=0;i<n;i++)
        scanf("%d%d",&p[i].first,&p[i].second);
    **printf("%d\n",(int)p.max_size()); // prints 536870911**
    sort(p.begin(),p.begin()+n,compare);

    //for(int i=0;i<n;i++)
        //printf("%d %d\n",p[i].first,p[i].second);
        printf("%.6f\n",(p[n-1].second+p[n-2].second)/(20.0+p[n-1].first+p[n-2].first));

    return 0;
}

3 个答案:

答案 0 :(得分:44)

这可能与您的细分错误无关,但是......

在C ++中,您的“比较”谓词必须是strict weak ordering。特别是,“比较(X,X)” 必须为任何X返回“false”。在比较函数中,如果两个对都相同,则按下测试(p1.first <= p2.first),然后返回“true”。因此,这个“比较”谓词不会强加严格的弱排序,并且将其传递给“排序”的结果是不确定的。

答案 1 :(得分:3)

尝试使用n = 3276632770的所有值。我怀疑你会发现你正在经历某种溢出。这是因为2 ^ 15(32768)是可以使用16位表示的最大数字(假设您也允许负数)。您将不得不使用不同的数据类型。

<强>建议:

让它输出向量的maxsize:

cout << p.max_size();

让我们知道那是做什么的。一切正常,我预计它将在数亿(我的电脑上为536870911)。但如果它更像32768那么可能就是问题。

答案 2 :(得分:-2)

C ++有时表现怪异。我在basic_string.h文件中遇到了细分错误!我将代码库从GCC 4.2.1升级到GCC 5.4.0,突然发生了SEG FAULT,我想知道为什么相同的代码可以更早地工作,而现在却在C ++自己的STL中被破坏了。然后,我查看了回溯轨迹,发现它来自std::sort作为指针向量,它使用自定义比较器在通过成员函数ptr->GetName()获取对象名称的基础上比较指针。这个GetName()返回一个字符串。

我花了一整天的时间来弄清楚basic_string文件中的哪些更改可能导致此错误。然后,我了解了这种“严格的弱排序”,并相应地更改了比较器功能。还是没有运气。

然后我进行了调整,并将原来的比较器功能更改为Functor。现在,它起作用了。我不知道其背后的确切原因,但确实有效。

这是我原来的比较器函数:

bool swap (CLwPatternObj *a, CLwPatternObj *b){
    return a->GetName() < b->GetName() ) 
}

这是新的功能对象。

class CLwPatternComparator
{
public:
    bool operator() (CLwPatternObj *a, CLwPatternObj *b) 
    {
        return a->GetName() < b->GetName();
    }
};

相同的逻辑,但是它与Function Object一起使用。