sort⾃定义排序规则的static函数
sort函数对系统类型默认升序排列,当我们想降序排列或者对⾃定义数据类型排序时需要⼿写排序函数cmp,具体语句
为sort(a.begin(),a.end(),cmp)。
在做leetcode501题⽬时,发现⾃定义sort排序函数报错:error: reference to non-static member function must be called;英⽂的⼤致意思是:sort调⽤函数必须是static类型的。
所以这⾥牵扯出⼀个⼩知识点:sort中的⽐较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错。
在平常使⽤中,我们⼀般都是声明为全局函数,所以不会报错
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(const int& a,const int& b)
{
return a > b;//从⼤到⼩排序
}
int main()
{
int a[10]={2,3,30,305,32,334,40,47,5,1};
vector<int>nums(a, a +10);
sort(nums.begin(), d(), cmp);
for(auto x : nums)
cout << x;
cout << endl;
system("pause");
return0;
}
但在leetcode的类模板中,cmp不能作为普通成员函数调⽤,要声明成静态成员函数
class Solution {
private:
void searchBST(TreeNode* cur, unordered_map<int,int>& map){// 前序遍历
if(cur ==NULL)return;
map[cur->val]++;// 统计元素频率
searchBST(cur->left, map);
searchBST(cur->right, map);
return;
}
//声明成静态成员函数
bool static cmp (const pair<int,int>& a,const pair<int,int>& b){
return a.second > b.second;
}
public:
vector<int>findMode(TreeNode* root){
unordered_map<int,int> map;// key:元素,value:出现频率
vector<int> result;
if(root ==NULL)return result;
int函数啥意思searchBST(root, map);
vector<pair<int,int>>vec(map.begin(), d());
sort(vec.begin(), d(), cmp);// 给频率排个序
result.push_back(vec[0].first);
for(int i =1; i < vec.size(); i++){
// 取最⾼的放到result数组中
if(vec[i].second == vec[0].second) result.push_back(vec[i].first);
else break;
}
return result;
}
};
因为:⾮静态成员函数是依赖于具体对象的,⽽std::sort这类函数是全局的,因此⽆法再sort中调⽤⾮静态成员函数。
静态成员函数或者全局函数是不依赖于具体对象的, 可以独⽴访问,⽆须创建任何对象实例就可以访问。同时静态成员函数不可以调⽤类的⾮静态成员。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。