C++重载operator<校验day_hh:mm:ss时间先后的代码重构求助
问题说明
需求为手动校验day_hh:mm:ss格式的日期时间(例如1_09:00:01)的先后顺序,比较完成后返回布尔值。现有手写的DateHour类operator<重载实现存在部分测试用例无法通过的问题,需要排查优化,原有实现代码如下:
bool DateHour::operator<(const DateHour& date_hour) const{ if(days <= dh.days){ if(hours <= dh.hours || dh.days > days){ if(minutes <= dh.minutes || dh.hours > hours || dh.days > days ){ if(seconds < dh.seconds || dh.minutes > minutes || dh.hours > hours || dh.days > days) return true; else if(days == dh.days && hours == dh.hours && minutes == dh.minutes && seconds == dh.seconds) return false; return true; } return false; } return false; } return false; }
原有代码问题排查
- 存在低级笔误:函数入参名是
date_hour,但内部比较逻辑全部使用了未定义的dh变量,代码本身就无法正常编译 - 比较逻辑混乱冗余:多层嵌套if中混用
<=判断和高位字段不等的兜底分支,边界场景极易判断错误,例如同天同时同分的场景下,秒数更大的值会被误判为小于;高位字段相等时用<=判断会把相等场景误判为真,不符合operator<的严格小于语义 - 不满足严格弱序要求:C++标准规定
<运算符必须满足严格弱序,相等场景必须返回false,否则用在std::sort、std::map等标准组件时会触发未定义行为,原有逻辑的多层判断很容易打破这个约束
重构优化方案
按时间字段的优先级(天>时>分>秒)从高到低依次比较即可,高优先级字段不相等时直接返回比较结果,相等时再比较下一级字段,完全不需要多层嵌套,实现简单且不会出错:
bool DateHour::operator<(const DateHour& other) const { // 先比天,天不等直接返回结果 if (days != other.days) { return days < other.days; } // 天相等再比小时 if (hours != other.hours) { return hours < other.hours; } // 小时相等再比分钟 if (minutes != other.minutes) { return minutes < other.minutes; } // 前面都相等最后比秒 return seconds < other.seconds; }
额外优化方向:
- 如果使用C++20及以上版本,不需要手写比较逻辑,直接默认生成三路比较运算符即可,编译器会自动按成员声明顺序生成正确的全量比较逻辑:
auto operator<=>(const DateHour&) const = default; - 补充字段合法性校验:从
day_hh:mm:ss格式字符串解析对象时,需要校验各字段取值范围合法(天为正整数、小时范围0-23、分和秒范围0-59),避免非法值导致比较结果异常
内容的提问来源于stack exchange,提问作者Olivia22
相关产品推荐
相关产品推荐

