刷LeetCode的时候,由于最终结果是要写一个solution的类,但是比较头疼的是sort似乎不可以写一个cmp函数来重载。
例如
class Solution {
public:
int Hash[1005];
bool cmp(int a, int b){
return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
}
vector relativeSortArray(vector& arr1, vector& arr2) {
for(int i = 0; i < 1005; ++ i)
Hash[i] = 2000;
for(int i = 0; i < arr2.size(); ++ i)
Hash[arr2[i]] = i;
vectorarr = arr1;
sort(arr.begin(), arr.end(), cmp);
return arr;
}
};
就会给出以下的报错
error: invalid use of non-static member function 'bool Solution::cmp(int, int)'
有两种解决方法:
在cmp前面加上一个static定义即可。
本次由于cmp函数需要使用外部的Hash数组,此方法失效。
static bool cmp(int a, int b){
return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
}
引发报错
invalid use of member 'Solution::Hash' in static member function
本方法相当于方法一的简写,即直接用以下格式,在调用sort的时候,直接给出比较函数
sort(v.begin(), v.end(), [](int a, int b){return a < b};);
这种方法也是我比较喜欢的一种方法,同样本次由于cmp函数需要使用外部的Hash数组,此方法失效。
sort(arr.begin(), arr.end(), [](int a, int b){Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b};);
引发下面的报错:
error: 'this' was not captured for this lambda function
将比较函数cmp放到类的外面,加上inline声明,此时可以在sort中调用。
修改后代码AC:
int Hash[1005];
inline bool cmp(int a, int b){
return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
}
class Solution {
public:
vector relativeSortArray(vector& arr1, vector& arr2) {
for(int i = 0; i < 1005; ++ i)
Hash[i] = 2000;
for(int i = 0; i < arr2.size(); ++ i)
Hash[arr2[i]] = i;
vectorarr = arr1;
sort(arr.begin(), arr.end(), cmp);
return arr;
}
};
简单来讲,就是函数参数不匹配的问题。因为我们普通的成员函数都有一个隐含的this指针。
bool cmp( Solution* this, const Interval &a,const Interval &b );
实际上cmp函数有三个参数,而我们调用sort()排序函数的时候只需要用到两个参数进行比较,所以就出现了形参与实参不匹配的情况(函数有三个形参,但是只输入了两个实参)。
总的来讲,最简单的处理方法就是在cmp前加上static,可以解决绝大多数的重载问题。碰到需要利用其它外部的东西来辅助比较的时候,就用方法三。平时也可以用方法二lambda来精简自己的代码。