LeetCode重新排列日志文件sort调用自定义cmp报错原因求解
报错原因分析
- 自定义比较器为类的非静态成员函数:C++类的非静态成员函数默认携带隐藏的
this指针作为第一个入参,而std::sort要求比较器可接收两个待比较的字符串参数,参数数量、类型不匹配会直接触发调用报错。你可以将cmp函数声明为static静态成员,或者将其移到Solution类外部解决这个问题。 - 比较器不满足STL算法要求的严格弱序规则:
std::sort要求比较器返回true仅当第一个参数应当排在第二个参数之前,相等时两个参数互相比较都要返回false。你当前使用return s1 <= s2,当两个日志内容相等时,cmp(a,b)和cmp(b,a)都会返回true,违反严格弱序约定,会触发未定义行为,部分编译器会直接抛出断言错误。你需要将返回值修改为严格小于的判断,同时补充题目要求的「内容相等时按标识符排序」的逻辑:内容相等时比较两个日志的标识符前缀。
修复后完整代码
class Solution { public: // 改为静态成员函数 static bool cmp(string str1, string str2) { int sp1 = str1.find(' '), sp2 = str2.find(' '); string content1 = str1.substr(sp1 + 1), content2 = str2.substr(sp2 + 1); if (content1 != content2) { // 严格小于符合严格弱序要求 return content1 < content2; } // 内容相等时按标识符排序 return str1.substr(0, sp1) < str2.substr(0, sp2); } vector<string> reorderLogFiles(vector<string> &logs) { int n = logs.size(); vector<string> ansLog(n); int start = 0, end = n - 1; for (auto str : logs) { reverse(str.begin(), str.end()); if (isdigit(str[0])) { reverse(str.begin(), str.end()); ansLog[end] = str; end--; } else { reverse(str.begin(), str.end()); ansLog[start] = str; start++; } } end++; reverse(ansLog.begin() + end, ansLog.end()); sort(ansLog.begin(), ansLog.begin() + start, cmp); return ansLog; } };
内容的提问来源于stack exchange,提问作者avishek kumar
相关产品推荐
相关产品推荐

