微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计划终止信号SIGABRT,中止抛“的std :: out_of_range”一个实例后终止叫

如何解决计划终止信号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 举报,一经查实,本站将立刻删除。