如何解决计划终止信号SIGABRT,中止抛“的std :: out_of_range”一个实例后终止叫
的问题是:考虑数字字符串的数组,其中每个串是具有从1到10 ^ 6位的任意位置的正数。排序阵列的在非递减,或上升它们的整数值的顺序并返回排序后的数组元素。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NCALLS 10000000
#define NCOLS 7
#define NLInes 7
int main(void) {
int i,val;
long begin,diff,end;
begin = time(NULL);
srand(time(NULL));
printf("\nTIMING TEST: %d calls to rand()\n\n",NCALLS);
for (i = 1; i <= NCALLS; ++i) {
val = rand();
if (i <= NCOLS * NLInes) {
printf("%7d",val);
if (i % NCOLS == 0)
putchar('\n');
} else
if (i == NCOLS * NLInes + 1)
printf("%7s\n\n",",..,");
}
end = time(NULL);
diff = end - begin;
printf("%s%ld\n%s%ld\n%s%ld\n%s%,10f\n\n","End time: ",end,"Begin time: ",begin,"Elapsed time: ","Time for each call:",(double)diff / NCALLS);
return 0;
}
vector<string> bigSorting(vector<string> unsorted) {
for(int i=0 ; i<unsorted.size() ; i++){
for(int j=0 ; j<unsorted.size()-1; j++){
long int a = stol(unsorted[j]);
long int b = stol(unsorted[j+1]);
if(a > b){
string x = unsorted[j];
unsorted[j] = unsorted[j+1];
unsorted[j+1] = x;
}
}
}
return unsorted;
}
解决方法
正如评论中指出的那样,您的错误源于您尝试将多位数(最多一百万)的数字读入 64 位数字,该数字可以容纳最多 (val & (1 << n)) >> n
的所有数字,即没有数字超过 20 位数字。
因此您必须找到另一种方法来比较这些字符串。关于前导零的问题不是很清楚,但让我们假设数字是在没有前导零的情况下表示的。然后,代表数字的 1<<64=18446744073709551616
可以通过它们的 std::string
进行比较,如果相等,则按字典顺序进行比较,这由 size()
之间的 operator<
实现,即
std::string
如果有前导零,您必须相应地调整您的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。