关于类中重载sort函数的报错问题(解决error: invalid use of non-static member function 'bool Solution::cmp(int, int)')

刷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

方法二:lambda

本方法相当于方法一的简写,即直接用以下格式,在调用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来精简自己的代码。

你可能感兴趣的:(Leetcode)