我是初学者。我试图学习sort()函数的可选第3个参数的用法。我尝试将其应用于按照递增顺序的除数来对1到1000之间的数字进行排序。
这是我的代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct data {
int index;
int divisor;
}a[1001];
bool sortbydivisor (const data &lhs,const data &rhs)
{
return lhs.divisor <rhs.divisor;
}
int number_of_divisors(int n)
{
int r=0;
for (int i=1;i*i<=n;i++)
{
if (n%i==0)
{
if (i*i!=n)
{
r+=2;
}
else
{
r+=1;
}
}
}
return r;
}
int main ()
{
int i,t,x;
for (i=1;i<=1000;i++)
{
a[i].index=i;
a[i].divisor=number_of_divisors(i);
}
sort(a+1,a+10001,sortbydivisor);
scanf("%d",&t);
for (i=1;i<=t;i++)
{
scanf("%d",&x);
printf("Case %d: %d\n",i,a[x].index);
}
return 0;
}
编译后我没有收到任何错误。但在运行之后我得到了这个警告“程序停止工作”。在线编译器中它说“运行时错误”:(。为什么?
先谢谢你的帮助:)。
答案 0 :(得分:1)
很难知道但是如果你在debug中编译并运行,你应该能够得到一个调用堆栈来确定程序失败的位置,并且应该为你提供程序失败的信息。
请注意,您在初始化循环中使用索引不一致(以1000结尾),在排序算法中使用10001。这超出了你的数组范围。
答案 1 :(得分:0)
你给出了一个无效的上限,所以sort
试图在数组结束后移动不存在的对象。你想要
sort(a+1,a+1001,sortbydivisor); // not 10001
在C ++ 11中,有一些方便的库函数可以避免这样的错误:
sort(std::begin(a) + 1, std::end(a), sortbydivisor);
注意begin
由于基于单一的索引而需要略微避开。如果你不能使用C ++ 11库,那么很容易自己编写:
template <typename T, size_t N> T * begin(T (&a)[N]) {return a;}
template <typename T, size_t N> T * end (T (&a)[N]) {return a+N;}
答案 2 :(得分:0)
sort(a+1,a+10001,sortbydivisor);
愚蠢的拼写错误!