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(), nums.end(), cmp);
	for(auto x : nums)
		cout << x;
	cout << endl;
	system("pause");
	return 0;
}

但在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;
        searchBST(root, map);
        vector<pair<int, int>> vec(map.begin(), map.end());
        sort(vec.begin(), vec.end(), 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中调用非静态成员函数。
静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值