问题描述
你是否在刷LeetCode时出现过下面的情况?
而如果加上static就不会报错?

问题分析
在class类中的sort函数的参数cmp,定义时要声明为static,那么背后的原因是什么呢?
这是跟sort函数的定义有关系的,下面是sort函数的源码官方文档
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
可以知道其实我们写参数cmp时,是把函数名作为实参传递给了sort函数,而sort函数内部是用一个函数指针去调用这个cmp函数的(建议先看下 一文搞懂什么是 函数指针 ),我们知道class普通类成员函数cmp需要通过对象名.cmp()
来调用,而sort()函数早就定义好了,那个时候哪知道你定义的是什么对象,所以内部是直接cmp()
的,那你不加static时,去让sort()直接用cmp()
当然会报错
static静态成员函数不用加对象名,就能直接访问函数(这也是静态成员函数的一大优点)所以加了static就不会报错
实战演练
class Solution {
public:
// 加上static就不会报错
static bool cmp (vector<int> A, vector<int> B) {
return A.size() > B.size();
}
vector <vector<int>> res;
vector <int> tmp;
void dfs(TreeNode* root, int exceptNumber) {
if (!root) return;
if (root->left == NULL && root->right == NULL) {
if (root->val == exceptNumber) {
tmp.push_back(root->val);
res.push_back(tmp);
tmp.pop_back();
}
return;
}
tmp.push_back(root->val);
dfs(root->left, exceptNumber - root->val);
tmp.pop_back();
tmp.push_back(root->val);
dfs(root->right, exceptNumber - root->val);
tmp.pop_back();
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
dfs(root, expectNumber);
// 传入cmp函数名(地址)
sort(res.begin(), res.end(), cmp);
return res;
}
};