C++对二进制文件读取的结构体排序报invalid operator<错误如何解决
问题根源
你遇到的invalid operator<报错核心原因是比较器的实现错误:ticket结构体里的destination是char[50]类型,直接用<运算符比较两个数组名时,实际比较的是两个数组的首地址,而不是字符串的字典序,完全不符合std::sort对比较器严格弱序的要求,因此触发断言报错。
修复方案
1. 基于现有char数组结构的修复
替换比较器逻辑,用C标准库的字符串比较函数strcmp判断字符串字典序,同时引入对应的头文件:
首先在代码开头新增头文件引用:
#include <cstring>
再修改比较器实现:
// 用const引用传递参数可避免结构体拷贝,性能更优也更符合规范 bool comparator(const ticket& a, const ticket& b) { // strcmp返回值小于0表示a.destination字典序小于b.destination return strcmp(a.destination, b.destination) < 0; }
2. 可选C++风格优化方案
如果没有强制要求用char数组存储数据,可以把结构体成员替换为std::string类型,天然支持<运算符做字符串字典序比较:
首先引入string头文件:
#include <string>
修改结构体和比较器:
struct ticket{ std::string destination; std::string flightNumber; std::string Aircraft; }; bool comparator(const ticket& a, const ticket& b) { return a.destination < b.destination; }
额外注意事项
你当前代码如果读取文件失败,newA数组会处于未初始化状态,直接传入sort会触发未定义行为,建议在文件打开失败的分支里直接终止程序,不要执行后续排序逻辑。
内容的提问来源于stack exchange,提问作者OlegEwtuschenko
相关产品推荐
相关产品推荐

