网络知识 娱乐 C++: terminate called after throwing an instance of ‘std::length_error‘ (sort函数c

C++: terminate called after throwing an instance of ‘std::length_error‘ (sort函数c

刷Leetcode-539:最小时间差时遇到了个大问题:

 报错如下:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create

错误代码如下:

class Solution {
public:
    static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
        int Xshi= (x[0]-'0')*10+x[1]-'0';
        int Xfen= (x[3]-'0')*10+x[4]-'0';
        int Yshi= (y[0]-'0')*10+y[1]-'0';
        int Yfen= (y[3]-'0')*10+y[4]-'0';
        if(Xshi>Yshi || (Xshi==Yshi && Xfen> Yfen))  return false;
        else return true;
    }
    //输入时间已排序好 x小于y 求两个时间分钟差函数
    int Time_diff(string x,string y){
        int Xshi= (x[0]-'0')*10+x[1]-'0';
        int Xfen= (x[3]-'0')*10+x[4]-'0';
        int Yshi= (y[0]-'0')*10+y[1]-'0';
        int Yfen= (y[3]-'0')*10+y[4]-'0';

        int diff=(Yshi-Xshi)*60;
        if(Yfen>Xfen) diff+=Yfen-Xfen;
        else diff-=Xfen-Yfen;
        return diff;
    }
    int findMinDifference(vector& timePoints) {
        //排序后相邻两个之间进行对比 另外第一个和最后一个也要对比
        sort(timePoints.begin(),timePoints.end(),cmp);
        //第一个和最后一个对比
        int T_min=min(  Time_diff(timePoints[0],timePoints[timePoints.size()-1]),  
                        1440-(Time_diff(timePoints[0],timePoints[timePoints.size()-1])) );
        //相邻两个进行对比
        for(int i=1;i<timePoints.size();i++)
        {
            T_min=min(T_min, Time_diff(timePoints[i-1],timePoints[i]) );
        }
        return T_min;
    }
};

来回看代码,愣是看不出任何问题,查阅了几百个相关网页,基本都是说以下两个原因:

  1. 输入了空字符串
  2. 数组下标越界

然而我的代码里明显并没有这两个问题。最后查了一晚上,找到了官方对于sort排序比较的说明。

https://en.cppreference.com/w/cpp/named_req/Compare

我们重点看这里:

 也就是说,对于我们手写的这个cmp比较函数,要满足以下三点:

  1. 对于所有的输入a,输入两个相同的元素,即cmp(a,a),返回的结果要是false,不能是false。
  2. 如果输入cmp(a,b)的结果为true,反过来输入cmp(b,a)的结果要是false,也就是如果a>b,不能再出现b>a,否则就发生矛盾了。
  3. 如果输入的 cmp(a,b)的结果为ture,以及输入 cmp(b,c)的结果为true,那么cmp(a,c)的结果也要为true,这个也很好理解,如果a>b且b>c那么a必然要大于c。

这里主要就是要注意第一点,当输入的两个数相同时,返回的结果要为false,而我的代码:

    static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
        int Xshi= (x[0]-'0')*10+x[1]-'0';
        int Xfen= (x[3]-'0')*10+x[4]-'0';
        int Yshi= (y[0]-'0')*10+y[1]-'0';
        int Yfen= (y[3]-'0')*10+y[4]-'0';
        if(Xshi>Yshi || (Xshi==Yshi && Xfen> Yfen))  return false;
        else return true;
    }

不满足这个规则。因此加上个  =  号,使其符合规则即可。

    static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
        int Xshi= (x[0]-'0')*10+x[1]-'0';
        int Xfen= (x[3]-'0')*10+x[4]-'0';
        int Yshi= (y[0]-'0')*10+y[1]-'0';
        int Yfen= (y[3]-'0')*10+y[4]-'0';
        if(Xshi>Yshi || (Xshi==Yshi && Xfen>= Yfen))  return false;
        else return true;
    }

困扰了我整整一晚上的问题得以解决。