sort函数C++分段错误

avd*_*avd 13 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;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*wis 46

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

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

  • +1 - 很好地发现!@aditya:请记住,STL比较函数要求"是第一个小于第二个" - 而不是"它们是否相等". (2认同)
  • @Aditya:非严格一致的C++程序可能会对某些输入起作用,而其他输入也会失败,这有很多种原因.考虑这样的情况:库对大容器使用一种算法(如果违反严格的弱排序则转储核心),并对较小的N值使用更简单(和更宽容)的算法. (2认同)
  • 这给我带来了一些非常随机的段错误.我仍然无法相信糟糕的排序机制实际上可以破坏堆栈.很棒,谢谢. (2认同)