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

LeetCode按频率升序排序数组C++报non-static member function引用错误

错误分析
  • 编译报错的直接原因:你定义的compare是类的非静态成员函数,这类函数默认隐含this指针作为第一个入参,而std::sort要求的比较函数需要接收两个参数做对比,参数数量不匹配因此触发编译错误。
  • 隐藏的逻辑错误:std::map是有序关联容器,本身会按照键的大小默认升序排列,且它的迭代器是双向迭代器,不满足std::sort要求的随机访问迭代器条件,无法直接对map本身执行排序操作。
修复方案
  1. 将compare函数声明为静态成员函数,去掉隐含的this指针入参,匹配sort对比较函数的参数要求
  2. 把map中统计好的频率键值对先转存到vector中,再对vector执行排序操作
  3. 遍历排序后的vector生成最终结果
修正后的代码
class Solution {
public:
    // 改为静态成员函数
    static bool compare(pair<int,int>p1,pair<int,int>p2)
    {
        if(p1.second < p2.second)
            return true;
        else if(p1.second == p2.second)
        {
            // 频率相同时数值大的排在前面
            return p1.first > p2.first;
        }
        else
            return false;
    }
    vector<int> frequencySort(vector<int>& nums) {
        vector<int> final(nums.size());
        int k = 0;
        map<int,int> mpp;
        for(int i = 0; i < nums.size(); i++)
        {
            mpp[nums[i]]++;
        }
        // 将map内容转存到vector以支持排序
        vector<pair<int, int>> vec(mpp.begin(), mpp.end());
        // 对vector执行排序
        sort(vec.begin(), vec.end(), compare);
        for(auto it : vec)
        {
            while(it.second)
            {
                final[k++] = it.first;
                it.second--;
            }
        }
        return final;
    }
};

你也可以直接用lambda表达式代替单独的compare函数,写法更简洁:

sort(vec.begin(), vec.end(), [](const pair<int,int>& p1, const pair<int,int>& p2) {
    if(p1.second != p2.second) return p1.second < p2.second;
    return p1.first > p2.first;
});

内容的提问来源于stack exchange,提问作者Vatsal A Mehta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:18:02