IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++: terminate called after throwing an instance of ‘std::length_error‘ (sort函数cmp排序规则问题) -> 正文阅读

[C++知识库]C++: terminate called after throwing an instance of ‘std::length_error‘ (sort函数cmp排序规则问题)

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<string>& 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;
    }

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

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:02:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:51:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计