在此代码中,对于矢量大小,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;
}
答案 0 :(得分:44)
这可能与您的细分错误无关,但是......
在C ++中,您的“比较”谓词必须是strict weak ordering。特别是,“比较(X,X)”
必须为任何X返回“false”。在比较函数中,如果两个对都相同,则按下测试(p1.first <= p2.first)
,然后返回“true”。因此,这个“比较”谓词不会强加严格的弱排序,并且将其传递给“排序”的结果是不确定的。
答案 1 :(得分:3)
尝试使用n = 32766
到32770
的所有值。我怀疑你会发现你正在经历某种溢出。这是因为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一起使用。