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中调用非静态成员函数。
静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。