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

C++类内如何调用自定义comparator函数作为sort排序的比较参数?

问题原因

你遇到的报错核心原因有3个:

  1. 非静态类成员函数隐含一个this指针作为第一个参数,而std::sort要求传入的比较器是可以接收2个待比较元素作为参数的可调用对象,参数数量不匹配导致编译失败。
  2. 自定义的myfun比较器参数类型是pair<string,string>,但你待排序的容器li元素类型是vector<string>,两者类型不匹配,即使解决了静态问题也会调用失败。
  3. 比较逻辑存在笔误:return a.first>a.first;恒为false,应该是对比a和b的首字段。

最简解决方法

方案1:将比较器改为静态成员函数(改动量最小)

给比较器添加static修饰,同时修正参数类型和访问逻辑即可:

class Solution{
public:
    // 加static修饰,修正参数类型和笔误
    static bool myfun(const vector<string>& a, const vector<string>& b){
        if(a[1] == b[1]){
            // 票数相同时按姓名字典序降序排列
            return a[0] > b[0];
        }
        // 票数不同时按票数升序排列
        return a[1] < b[1];
    }

    vector<string> winner(string arr[],int n)
    {
        unordered_map<string,int> dic;
        for (int i=0;i<n;i++){
            dic[arr[i]] += 1;
        }
        vector<vector<string>> li;
        for (auto& name:dic){
            li.push_back({name.first, to_string(name.second)});
        }
        sort(li.begin(), li.end(), myfun);
        return li[0];
    }
};

方案2:使用Lambda表达式(更灵活,无需单独定义成员函数)

如果该比较器仅在当前排序处使用,直接在sort参数中写Lambda表达式更简洁,不需要额外定义类成员:

class Solution{
public:
    vector<string> winner(string arr[],int n)
    {
        unordered_map<string,int> dic;
        for (int i=0;i<n;i++){
            dic[arr[i]] += 1;
        }
        vector<vector<string>> li;
        for (auto& name:dic){
            li.push_back({name.first, to_string(name.second)});
        }
        // 直接内联写Lambda比较器
        sort(li.begin(), li.end(), [](const vector<string>& a, const vector<string>& b){
            if(a[1] == b[1]) return a[0] > b[0];
            return a[1] < b[1];
        });
        return li[0];
    }
};

可选优化

你也可以将li的类型改为vector<pair<string,string>>,相比vector<string>内存占用更低、访问速度更快,修改后比较器就可以用first/second访问字段:

// 修改li定义
vector<pair<string, string>> li;
// push改为
li.emplace_back(name.first, to_string(name.second));
// 比较器对应修改
static bool myfun(const pair<string,string>& a, const pair<string,string>& b){
    if(a.second == b.second) return a.first > b.first;
    return a.second < b.second;
}

内容的提问来源于stack exchange,提问作者RAHUL KUMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:18:00