You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:06:02