LeetCode按频率升序排序数组C++报non-static member function引用错误
错误分析
- 编译报错的直接原因:你定义的
compare是类的非静态成员函数,这类函数默认隐含this指针作为第一个入参,而std::sort要求的比较函数需要接收两个参数做对比,参数数量不匹配因此触发编译错误。 - 隐藏的逻辑错误:
std::map是有序关联容器,本身会按照键的大小默认升序排列,且它的迭代器是双向迭代器,不满足std::sort要求的随机访问迭代器条件,无法直接对map本身执行排序操作。
修复方案
- 将
compare函数声明为静态成员函数,去掉隐含的this指针入参,匹配sort对比较函数的参数要求 - 把
map中统计好的频率键值对先转存到vector中,再对vector执行排序操作 - 遍历排序后的
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
相关产品推荐
相关产品推荐

